- 拷贝就是一个变量的值传给另外一个变量。在python 中 id()方法可以查看存放变量的内存地址,这为我们下面理解深浅copy提供了便利。
例一:
a = [1, 2, 3, 4, 5]
b = a
print(id(a), id(b))
4300725192 4300725192
简单的赋值运算,是在内存中增加一个新的指向,所以 id(a) == id(b)
例二:
使用copy模块进行copy, id(a) != id(b)
import copy
a = [1, 2, 3, 4, 5]
b = copy.copy(a)
print(id(a), id(b))
4468231048 4468229448
例三;
当a变量里面引用了其他变量
import copy
c = [6, 7]
a = [1, 2, 3, 4, 5, c]
b = copy.copy(a)
b[5][0] = 10
print(a, b)
print(id(a), id(b))
[1, 2, 3, 4, 5, [10, 7]] [1, 2, 3, 4, 5, [10, 7]]
4502013512 4502138824
只对b的变量进行了修改,发现a == b,但是id(a) !=id(b),但使用copy时b把a里面引用c的地址只是做了新的指向没有产生新的地址.
执行:
b[5][0] = 10
是对c的内容进行了修改,所以最终a == b
- 这样的copy称为浅拷贝
例四:
import copy
c = [6, 7]
a = [1, 2, 3, 4, 5, c]
b = copy.deepcopy(a)
b[5][0] = 10
print(a, b)
print(id(a), id(b))
[1, 2, 3, 4, 5, [6, 7]] [1, 2, 3, 4, 5, [10, 7]]
4551325512 4551182600
当使用copy.deepcopy(a)时结果发现 a !=b id(a)!=id(b)
这样的copy称为深拷贝, 在拷贝时去a的引用值也进行copy一份生成新的内存地址,
所以在修改b的时候a的值不变