python的对象引用、深拷贝、浅拷贝的区别

1、对于python对象的引用,即把一个对象直接赋值给另外一个对象;
代码如下:
python的对象引用、深拷贝、浅拷贝的区别b对象和a对象完全一样;创建一个新的变量,传递a的引用,内存地址,b和a完全一样,这就是引用传递的含义吧。即两个变量指向一个内存地址,参考大佬的图解如下:
python的对象引用、深拷贝、浅拷贝的区别
2、浅拷贝
b变量会对a对象中的地址复制一份,但是不会拷贝内部的元素;
python的对象引用、深拷贝、浅拷贝的区别
可以看出c变量的地址和a的不同,但是内部元素存储的地址完全相同,对于浅拷贝来说,只会保存原有对象的内存地址,但是不会保存内部的元素;(即如果原有对象内部元素的内存地址改变,在浅拷贝后的变量中是看不出来的),但是,如果内部元素的内存地址不改变,在浅拷贝后的变量中是可以显示出来的,例如,对于,不可变对象,a[0]=‘hello’ ,新建立一个对象’hello’, 改变了元素的地址,但是对于可变对象list之类的,是不会改变元素地址的,图解如下:
python的对象引用、深拷贝、浅拷贝的区别
我的理解是只拷贝过来了内部元素的地址;
python的对象引用、深拷贝、浅拷贝的区别
在list中添加后,内存地址没变,所以c也会改变;

3、深拷贝
所有部分都拷贝过来了,也保存了内部的元素,即两部分互不干扰;
python的对象引用、深拷贝、浅拷贝的区别
可以看出不是简单的拷贝内存地址,其中a[2]是list,可变类型,地址就不再相同,即a[2]的变化不会影响到d[2];同时由于a[0]是不可变类型,因此a[0]和d[0]也相互不影响;下面我们进行测试:(int,string,float,tuple)都是不可变对象;
python的对象引用、深拷贝、浅拷贝的区别
个人见解,如有错误请直接指出。

参考:
https://www.cnblogs.com/wilber2013/p/4645353.html