浅拷贝: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]
>>>