浅拷贝:b=copy.copy(a),对引用的拷贝,只拷贝父对象,所以id(b)不等于id(a),但对象内部资源依然引用,内部id(b[0])等于id(a[0]),id(b[4])等于id(a[4])

深拷贝:c=copy.deepcopy(a),对对象资源的拷贝,id(c)不等于id(a),内部id(c[0])等于id(a[0]),id(c[4])不等于id(a[4])


注意:因为数字是不可变量,所以数字的id不变,无论深拷贝还是浅拷贝,id(b[0])、id(c[0])都等于id(a[0]);列表是可变变量,所以列表的id如果是深拷贝会变,id(c[4])不等于id(a[4])


参考代码如下:

>>> import copy
>>> a=[0,1,2,3,[4,5,6]]
>>> id(a)
33371200
>>> id(a[0])
33739468
>>> id(a[4])
44919024
>>> id(a[4][0])
33739420
>>> b=a
>>> id(b[0])
33739468
>>> id(b[4])
44919024
>>> id(b[4][0])
33739420
>>> b=copy.copy(a)
>>> id(b)
38581792
>>> id(b[0])
33739468
>>> id(b[4])
44919024
>>> id(b[4][0])
33739420
>>> b[4][0]=44
>>> b
[0, 1, 2, 3, [44, 5, 6]]
>>> a
[0, 1, 2, 3, [44, 5, 6]]
>>> b[0]=9
>>> b
[9, 1, 2, 3, [44, 5, 6]]
>>> a
[0, 1, 2, 3, [44, 5, 6]]
>>> id(a)
33371200
>>> id(a[0])
33739468
>>> id(a[4])
44919024
>>> id(a[4][0])
33738940
>>> c=copy.deepcopy(a)
>>> c
[0, 1, 2, 3, [44, 5, 6]]
>>> id(c)
44917664
>>> id(c[0])
33739468
>>> id(c[4])
44916864
>>> id(c[4][0])
33738940
>>> a
[0, 1, 2, 3, [44, 5, 6]]
>>> c
[0, 1, 2, 3, [44, 5, 6]]
>>> c[4][0]=444
>>> c
[0, 1, 2, 3, [444, 5, 6]]
>>> a
[0, 1, 2, 3, [44, 5, 6]]
>>> c[0]=9
>>> c
[9, 1, 2, 3, [444, 5, 6]]
>>> a
[0, 1, 2, 3, [44, 5, 6]]
>>>

Python深拷贝应用

所有参数在Python里都是按引用传递。如果你在函数里修改了参数,原始的参数也被改变了。如:对列表进行操作之后原来的列表会被改变,如下示例:

def changeme( mylist ):
        mylist[0] = 18
        print "函数内取值: ", mylist
mylist = [1,2,3,4,5]
changeme(mylist)
print "函数外取值: ", mylist

打印结果:

>>> 

函数内取值:  [18, 2, 3, 4, 5]

函数外取值:  [18, 2, 3, 4, 5]

>>> 


为了保留原始的数据,可以在操作前对原列表进行深拷贝。

import copy
def changeme( mylist ):
        mylist[0] = 18
        print "函数内取值: ", mylist
mylist = [1,2,3,4,5]
copylist=copy.deepcopy(mylist)
changeme(mylist)
print "函数外取值: ", copylist

打印结果:

>>> 

函数内取值:  [18, 2, 3, 4, 5]

函数外取值:  [1, 2, 3, 4, 5]

>>>