python 深浅拷贝

一、直接赋值,比如:a=b

(1)数字、字符串在内存中是同一块地址

(2)字典、列表、元组也是同一块内存地址,不发生变化

也就是说,在直接赋值情况下,不管a是什么数据类型,发生什么变化,b也一起发生变化。

 

举个栗子:

二、浅拷贝

浅拷贝需要导入copy模块,并调用其copy方法。比如:b = copy.copy(a)

(1)数字、字符串、元组在内存中是同一块地址(对于元组,不管是否多层嵌套还是深浅拷贝,内存地址都一样)

(2)无嵌套的列表和字典,如a=[1,2,3]或a={'username':'zhangsan','password':123},内存地址会改变

(3)字典中嵌套列表,如a= {'username':'zhangsan','password':123,'code':[1,2,3]},第一层的内存地址会改变,其他的内存地址不发生改变。看下图可以比较清楚了解。

 

举个栗子:

三、深拷贝

浅拷贝需要导入copy模块,并调用其deepcopy方法。比如:b = copy.deepcopy(a)

深拷贝的话记住一点:一定会在每层重新开辟一块内存,但是最里边的元素,如zhangsan,123,1,2,3依旧是引用。如下图所示:

 

关于深浅拷贝,下面举个栗子:

        深拷贝示意图

    深拷贝查看内存地址                   浅拷贝查看内存地址

对于多层嵌套列表:

可以从右上图里看到,浅拷贝只是拷贝第一层,再往里面全部都是引用(内存地址一样),也就是改变第一层的元素时,列表并不会变化,改变第二层或者更里面的层次时才会发生变化。

而深拷贝根据左上图和我自己画的示意图,可以看到如果有下一层(新的一层)时,一定会开辟新的内存空间,直到没有下一层;不管哪一层,最里面的元素依旧是引用,也就是说不管改变哪一层的元素,只是那一层的元素去重新指向,深拷贝后的列表依旧指向原来的,是不会变化的。

原文地址:https://www.cnblogs.com/hooo-1102/p/12108164.html