• python赋值,深拷贝和浅拷贝的区别


    1.赋值

    list1=[[1,2],'fei',66]
    list2=list1
    list1
    [[1, 2], 'fei', 66]
    list2
    [[1, 2], 'fei', 66]
    list2.append(77)
    list2
    [[1, 2], 'fei', 66, 77]
    list1
    [[1, 2], 'fei', 66, 77]
    id(list1),id(list2)
    (72624608, 72624608)

    总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加

    2.浅拷贝

    使用的方法:copy.copy()

    代码示例:

    >>> import copy
    >>> list1=[[1,2],'fei',66]
    >>> list2=copy.copy(list1)
    >>> print(id(list1))
    55713024
    >>> print(id(list2))
    55712864
    >>> print(id(list1[0]),'
    ',id(list2[0]))
    55712184 
     55712184
    >>> print(id(list1[1]),'
    ',id(list2[1]))
    61987040 
     61987040
    >>> print(id(list1[2]),'
    ',id(list2[2]))
    2057136240 
     2057136240
    
    #总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的
    
    >>>list1=[[1,2],'fei',66]
    >>> list2=copy.copy(list1)
    >>> list1
    [[1, 2], 'fei', 66]
    >>> list2
    [[1, 2], 'fei', 66]
    >>> list1[0][0]=11
    >>> list1
    [[11, 2], 'fei', 66]
    >>> list2
    [[11, 2], 'fei', 66]
    >>> list1[1]='change'
    >>> list1
    [[11, 2], 'change', 66]
    >>> list2
    [[11, 2], 'fei', 66]
    
    #总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)

    最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝

    3.深拷贝

    使用的方法:copy.deepcopy()

    代码示例:

    >>> list1=[[1,2],'fei',66]
    >>> list3=copy.deepcopy(list1)
    >>> print(id(list1),'
    ',id(list2))
    62055888 
     55713624
    >>> print(id(list1[0]),'
    ',id(list2[0]))
    55726368 
     55713704
    >>> print(id(list1[1]),'
    ',id(list2[1]))
    61987040 
     61987040
    >>> print(id(list1[2]),'
    ',id(list2[2]))
    2057136240 
     2057136240
    
    #总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样
    
    >>> list1[0][0]=11
    >>> list1
    [[11, 2], 'fei', 66]
    >>> list3
    [[1, 2], 'fei', 66]
    >>> list1[1]='change'
    >>> list1
    [[11, 2], 'change', 66]
    >>> list3
    [[1, 2], 'fei', 66]
    >>> id(list1[1])
    62058944
    >>> id(list3[1])
    61987040
    
    #总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化

    最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)

  • 相关阅读:
    javascript之数组去重方法
    经典问题之爬楼梯
    javascript之事件循环机制
    javascript之闭包
    javascript之动态改变this上下文
    块级元素的垂直居中对齐
    js数组对象
    javascript-冒泡法排序
    javascript-数组
    javascript-循环
  • 原文地址:https://www.cnblogs.com/pipile/p/12837261.html
Copyright © 2020-2023  润新知