在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用
浅拷贝
(1)直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
(2)copy浅拷贝,没有拷贝子对象,改变子对象会改变原始列表的子对象
from copy import copy
a=[1,2,3,[1,2]]
b=copy(a)
b[3].append(3)
b[0]=2
print(a,b)
#[1, 2, 3, [1, 2, 3]] [2, 2, 3, [1, 2, 3]]
深拷贝
包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变,这就是深拷贝
from copy import deepcopy
a=[1,2,3,[1,2]]
b=deepcopy(a)
b[3].append(3)
print(a)
#[1,2,3,[1,2]]
自己实现一个deepcopy,可以考虑用递归,实现对list的deepcopy,这里只考虑的list,但是实际还有tuple,dict,set
def deepcopy(obj):
mylist = []
for item in obj:
# item == list
if isinstance(item, list):
i = deepcopy(item)
mylist.append(i)
else:
mylist.append(item)
return mylist
网友评论