浅拷贝
浅拷贝copy.copy是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝里面的内容。
copy.copy和=号赋值不一样,=赋值id相同,copy赋值id不同。
复制对象最外层的内存。
浅拷贝对嵌套列表只拷贝引用。
切片操作是浅拷贝,id不同。
=号操作是赋值操作,创建一个新的名字指向一个内存,id相同。
对于不可变对象无法浅拷贝,不管是否不可变对象里面是否有可变引用还是不可边引用都不能拷贝, 会出来相同的id。
深拷贝
用copy.deepcopy复制一块内存。
深拷贝是两块不同的内存。互不影响。
对于不可变对象(元组)有指向可变对象则课业深拷贝才可以深拷贝,否则不可以可以会出来相同的id。
代码理解
ipython3>>
a = [11, 22]
b = [33, 44]
c = [a, b]
d = copy.copy(c)
e = copy.deepcopy(c)
id(c)
id(d)
id(e)
c.append([55, 66])
c
d
e
copy.copy(c) 只是单拷贝了外层的a和b的引用,
三个id都是不同的,c改变了但是d,e没有改变,
理解下面的代码结果会怎样。
def foo(numlist):
numlist.append(23)
l = [1, 2]
foo(l)
l = [1, 2]
foo(l[:])
foo(copy.copy(l))
foo(copy.deepcopy(l))
答案是,只有foo(l)能够修改l。可变对象来说才能改变。
切片
a = [1, 2]
b = a[::]
c = a
id(a)和id(b)不一样,id(a)和id(c)一样。切片操作是浅拷贝。
PS:对于dict,其value是引用,浅拷贝(dict.copy)的话,id不同,但是修改value会对其它对象产生影响。