python 深浅copy

今天面试的时候被问了深浅copy的问题,开始一直没想起来现在来做个总结。

首先我们来举个例子:

a=1

b=a             

这样我们知道在a的内存地址我们放入了 值1 然后b=a我们相当于让b指向了a的内存地址,如果单独打印a,b的内存地址是一样的

那么我们在后面加一个 a=2之后呢  b的内存地址是没变化的还是为原来为1的内存地址,而a想让于改变了内存地址,值变成了2。

好,理解了上面的之后我们来说说

a=[0,1,2]

b=a

这样同理b指向了a列表的内存地址,如果a[0]=1,那么b也会变成[1,1,2]而且内存地址不会发生变化

那么如果我们这样写呢,还是a=[0,1,2]

b=a.copy()

这样写你会发现a,b的内存地址是不同的但是一个有趣的地方是a[0]的内存地址和b[0]的内存地址是一样的,所以相当于你只是copy了一个最外面的列表壳,但是你如果改变了a[0]=1,这样a=[1,1,2],b=[0,1,2]a变了b没变这个我们就回到了第一个例子里面所讲的了,a[0]改变了内存地址,但是a[0]后面的元素没有,这个就是浅拷贝、

如果这样呢

b=a.deepcopy()

这个就相当于b是完完全全独立于a,每个子元素里面的都不一样,都有单独的内存地址,但是不建议用,因为数据太大,完完全全独立会占用大量的内存。

现在我们来总结一下

浅拷贝:相当于把存数据最外面的容器内存改变了,如一个列表的的内存地址改变,但是里面的元素内存没有发生变化。

深拷贝:完完全全改变了,想让与创建了一个新的,容器的内存和子元素的内存都发生了改变,占用大量的内存空间

猜你喜欢

转载自blog.csdn.net/ZC_father/article/details/81836155