先谈浅拷贝:
浅拷贝拷贝的是地址引用,可以找到共同的内容,原文件内容修改,拷贝的那份也会修改。
例子:
a = [1,2,3]
b = a
print(id(a))
print(id(b)--------他们两个的地址是相同的,内容也是一样的
a.append(4)
print(a)
print(b)-------a添加了4,b也会跟着变化。
再谈深拷贝:
深拷贝的内容一样,但是地址不一样,就算是一方文件修改,另外一方不会变化。
b = copy.deepcopy(a)
b得到的内容与a的内容完全是一样的,但是地址不会一样,就算是a中有对象引用,b中对应的引用的对象依然是内容一样,地址不一样
import copy
a = [1,2,3,4]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
注意:如果是一个不可变的对象(内部存储还是不可变对象),那时候就是浅拷贝,得到的地址也是一样的
a = (1,2,3,4)
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(a)
print(b)
copy.copy()这个函数结果会因为是可变的或则是不可变的而导致结果不同 只能拷贝一层。根据类型有关。若果是列表,就是深拷贝,若果是元组,就是浅拷贝,如果是有嵌套,浅拷贝。
可变的时候是深拷贝:
a = [1,2,3,4]
b = copy.copy(a)
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
不可变的时候是浅拷贝:
a = (1,2,3,4)
b = copy.copy(a)
print(id(a))
print(id(b))