![](https://csdnimg.cn/release/download_crawler_static/87983671/bg4.jpg)
#
修改
a
中的第一个元素为
'A'
a[0] = 'A'
print(a) # ['A', 1, 'd', ['z', 'x', 'c']]
print(b) # ['a', 1, 'd', ['z', 'x', 'c']]
发现
b
并没有受影响
#
修改第四个元素中的第一个元素,将
z
修改成
Q
a[3][1] = 'Q'
print(a) # ['A', 1, 'd', ['z', 'Q', 'c']]
print(b) # ['A', 1, 'd', ['z', 'Q', 'c']]
发现
b
也被修改了。
why
?
print(id(a[3])) # 2766208
print(id(b[3])) # 2766208
如上修改 a 中的第一个元素。b 不会被修改。但是修改 第四个元素中的第一个元素。b 却
被影响了。这就是前面说的浅拷贝只会拷贝第一层数据。
第二层['z', 'Q', 'c']并没有拷贝成功。
这个时候 b 中的['z', 'Q', 'c'] 的内存地址和 a 中的['z', 'Q', 'c']内存地址是一样的。 (浅拷贝
只是把这个第二层的引用拷贝过来了。)。所以 a 中第二层的数据发生变化,b 中的数据
也会跟着变化。
深拷贝:
对对象的完全拷贝,不管你有多少层,数据都不会共享。 深拷贝需要引入 copy 模块。
import copy
还是拿上面的数据我们进行演示。
import copy
a = ['a', 1, 'd', ['z', 'x', 'c']]
b = copy.deepcopy(a)
print(a) # ['a', 1, 'd', ['z', 'x', 'c']]
print(a) # ['a', 1, 'd', ['z', 'x', 'c']]
#
变量的内存空间地址
print(id(a)) # 120265424
print(id(b)) # 15809072
print(a[-1])
#
最后一个元素
(['z', 'x', 'c'])
的内存地址
print(id(a[-1])) # 16171936
print(id(b[-1])) # 120265344
#
修改
a[0] = 'A'
a[3][0] ='Q'
print(a) # ['A', 1, 'd', ['Q', 'x', 'c']]