一、直接赋值,比如: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依旧是引用。如下图所示:
关于深浅拷贝,下面举个栗子:
深拷贝示意图
深拷贝查看内存地址 浅拷贝查看内存地址
对于多层嵌套列表:
可以从右上图里看到,浅拷贝只是拷贝第一层,再往里面全部都是引用(内存地址一样),也就是改变第一层的元素时,列表并不会变化,改变第二层或者更里面的层次时才会发生变化。
而深拷贝根据左上图和我自己画的示意图,可以看到如果有下一层(新的一层)时,一定会开辟新的内存空间,直到没有下一层;不管哪一层,最里面的元素依旧是引用,也就是说不管改变哪一层的元素,只是那一层的元素去重新指向,深拷贝后的列表依旧指向原来的,是不会变化的。