Python——赋值、深拷贝和浅拷贝

赋值

赋值演示

我们先定义一个变量a,然后指向数值为100的这个空间,然后创建的变量b和a指向了同一个空间地址。
对象之间的赋值本质就是引用的传递。
那么思考一下,在针对操作可变变量数据的时候,修改了a的值之后b的变化是否会发生变化?
答案自然会是肯定的,因为赋值的本质只是引用的传递,只要传递了引用,地址就指向了同一个位置。

浅拷贝

浅拷贝演示1

首先我们先定义了一个空间给了a,然后我们有拷贝了一份一模一样的空间给了b,此时a,b对应的就是不一样的空间,引用不同。接下来我们修改变量a的值

浅拷贝演示2

此时,b的值没有发生改变。这刚好就验证了拷贝的结果是指向了不同的引用,但是这种情况下,不能看出来任何问题,接下来继续。

浅拷贝演示3

接下来我们在定义列表a给予另一个列表c,如何去理解列表a,就是列表a中还储存了另一个列表c的引用,我们可以发现,同样,在更改了除列表c的其余数值是,并不能导致copy的列表b的变化,刚好再一次的验证了,copy之后引用的不同。

浅拷贝演示4

但是接下来的问题出现在我们对列表c数值的修改之后,图片上操作的结果是列表a的值发生变化的同时,列表b的值也发生了变化,这要如何去解释了呢?
先记住这一句话,浅拷贝就是对数据顶层结构的照搬照抄,什么意思呢,b在对变量a进行拷贝的时候,是数据的我就直接找一个引用来把数据拷贝下来,但是,遇到了引用,我就拷贝引用,引用指向的地址里面储存的什么数据,不管,在b的地址中同样指向了这个引用,因此,在修改了变量c的值之后,地址中的数据变化之后,变量b同样也会发生变化。浅拷贝的数据拷贝不彻底,数据不会完全独立。

深拷贝

深拷贝是相对于浅拷贝来说的,深拷贝是一种完全的拷贝,数据之间是完全独立的,深拷贝是通过deepcopy实现的。

在这里插入图片描述

上图的结果输出可以明显的看出来,浅拷贝b和深拷贝c的区别就是,针对原始数据a的引用,浅拷贝只会拷贝引用,深拷贝会进行完全拷贝,将底层数据直接拷贝过来,完全独立,不会随着原始数据的变化而变化。

猜你喜欢

转载自blog.csdn.net/weixin_43617255/article/details/83796329