再说拷贝之前先说一说 is 与 ==
is 的作用是 比较两个引用是否为一个地址
== 是比较两个值
对变量 a 变量 b 都赋值为 2 : a 与 b 的值相等我们都可以理解,但是a与b引用地址也相同是为什么呢?
a和b中实际存储的就是一条地址,因为都赋值为2,所以就都存了内存单元中2的地址。也就是说如果增加一个变量c ,另c=a或c=b,那么c也指向的是2的内存地址;
接下来说拷贝,拷贝与 ‘=’ 赋值不同,拷贝是在建立一个空间,与原有的内容断开了联系。
深拷贝与浅拷贝:
进行拷贝首先引入copy模块 import copy
浅拷贝: copy.copy()
例如 a = copy.copy(b)
说到这里可能有人发现了一些小错误,不是说拷贝是另建空间吗?怎么使用了拷贝后 b is a 还是true?
这里有涉及到了python对内存操作中的一点小知识:
在 python 中数字 字符串,元组这些是不可变类型的,他们在内存中如果创建了地址就是固定的,如果另一个变量值也为这些,那么就会指向这个地址而不会再创建。所以即使使用了copy,也还是这个地址。而像列表等可变类型就会是另一种结果:
用一个可变类型列表来分别执行浅拷贝与赋值操作这样对比是不是更加容易理解呢
浅拷贝只是对于一个对象的顶层拷贝:
什么是顶层拷贝呢? 举个栗子:
对列表a进行拷贝 ,b 和 a 是一样的
对 a 追加一个元素,b并未发生改变
如果是赋值的话,a变,b也会变。
回到拷贝上我们再对 a 追加一个元素
当对列表a中的列表增加一个元素时,b中的列表也相应增加了。
所以浅拷贝只是对对象的顶层拷贝,并未真正断了所有联系!
深拷贝:copy.deepcopy()
例如 a = copy.deepcopy(b)
深拷贝与浅拷贝的区别就是深拷贝彻底断了所有联系!
再次使用上面的实例演示一下:
由以上操作可以看出,深拷贝是一种底层递归拷贝。
在深拷贝的操作下,a与b之间是完全断了联系的!