简单一点吧,太长了看不下去。。。。
copy.copy:浅拷贝,只拷贝父元素,不会拷贝子元素(的引用)。
copy.deepcopy: 深拷贝,拷贝父元素及其子元素(的引用)。
或许,例子更快一些:
import copy s1 = [1, 2, 3, [4, 5], '666'] print(s1) s2 = s1 #直接传递引用(可以看做传递的是地址) print(s2) s3 = copy.copy(s1) #浅复制 print(s3) s4 = copy.deepcopy(s1) #深复制 print(s4)
很明显这四个值都是一样的。。。
那么,当修改S1的值呢?
# 修改s1的值 s1.append('gogogo!') print(s1) print(s2) print(s3) print(s4)
咦,是不是跟想象的不太一样?
那么再修改S1的子元素呢?
# 修改s1的子元素值 s1[3].append('hello') print(s1) print(s2) print(s3) #为什么呢? 可以看做浅复制拷贝的是子元素的地址(引用),当子元素里面的值改变时,由于子元素地址并没有变,于是浅复制得到的值也被改变了 print(s4) #而深复制连子元素的内部值的地址也拷贝了
现在是不是如你所愿了。。。
查看元素地址 id函数:
print(id(s3[3])) print(id(s1[3]))
##
参考: