Python 深拷贝、浅拷贝

时间:2022-06-01 20:52:48

is 和 == 的区别

从简单的来说, is 比较的是地址,而 == 比较的是地址,下面我们来看一个例子

Python 深拷贝、浅拷贝
从上面 的例子中我们可以看到 m 和 n 两个列表值是相等的,但是地址不相同,我们看下两个变量的地址
Python 深拷贝、浅拷贝

但是读者不要忽略了重要的一点,请看下面的这种情况
Python 深拷贝、浅拷贝

注意,当我们在变量里面保存这种相同的地址的时候,在内存中保存的地址是一样的

读者应该意识当到,这种浅拷贝实际上是两个变量指向同一块地址,当内容发生改变的时候a和b的值都会发生改变

深拷贝 和 浅拷贝

1, 浅拷贝
Python 深拷贝、浅拷贝

从上图我们知道,当把a值赋值给b的时候,a,b两个变量指向的地址是一样的,也相当于只是拷贝了地址。
Python 深拷贝、浅拷贝
2, 深拷贝
Python 深拷贝、浅拷贝
从上面的代码来看,a 和 b的地址是不一样的,说明这是深拷贝,拷贝的不是地址,而是内容,这里需要用到copy这个模块
Python 深拷贝、浅拷贝

这里当其中一个变化时候不会影响另外的变量

3,扩展一
Python 深拷贝、浅拷贝

a 和 b分别是两个不同的变量空间,c 存放他们,但是存放的是地址,从上面来看,当a中添加一个元素的时候,c中也会变化,同事d = c也是浅拷贝,仅仅拷贝c的地址

4,扩展二
Python 深拷贝、浅拷贝

以扩展二为基础,当我在定义一个e,e去深拷贝d,又会是什么样的情况呢,会不会是地址,结果如下
Python 深拷贝、浅拷贝
当拷贝c的时候会直接深拷贝一份a和b放在e中,跟上面的没有关联了。也就是递归拷贝,当拷贝一个列表,列表中可能存在引用的地址,那么这就会递归的拷贝

5,扩展三 copy 和deepcopy的区别
Python 深拷贝、浅拷贝

从上面来看,e 是完全被拷贝出来,而d仅仅是拷贝地址,我们可以得出结论,copy是仅仅拷贝第一层,而deepcopy会递归拷贝,一直拷贝到最底层

6,扩展三 深拷贝值拷贝元组
Python 深拷贝、浅拷贝

大家记住元组是可不可遍历的,copy模块如果拷贝补课遍历的元组会直接全拷贝,如果拷贝可遍历的列表之类的,会拷贝第一层里面的东西