关于Python中的深浅拷贝和可变类型的理解
部分文章转载:https://www.jb51.net/article/166488.htm
1、可变类型和不可变类型
对于一个变量,改变其值,如果他地址也变了,则是不可变类型
反之,如果值变化但是地址不变,则是可变类型。
Python中的不可变类型:
int ,str,float,tuple,bool …
Python中的不可变类型:
list,dict,set
因此对于字典dict的key值来说,因为key是不可变的 ,所以上述不可变的数据类型才可以作为字典的key
列表不可以作为字典的key值试用
2、深浅拷贝
首先元组不能copy
其次,切片操作也是浅拷贝copy
拷贝分别深浅拷贝:copy和deepcopy
1、浅拷贝copy
浅拷贝copy是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
通过a=b这种方式赋值只是赋值的引用(内存地址),a和b都指向了同一个内存空间,所以他们的id(地址相同),这种就是浅拷贝
多层嵌套情况
浅拷贝的情况下,b会跟着原数组a的内层对象变化,当最外层a的对象变化时,b不会随之变化,具体的内存分配如图:
2、深拷贝copy.deepcopy
通过调用copy包里的deepcopy方法来深拷贝
通俗的理解就是完全的复制,复制之后就是两个完全不相干的变量,一个变化不会影响第二个
其实就是在内存区在分配保存了和a相同的数据,用c来指向它,和a的内存地址不同。怎么验证就是我说的这种情况的呢?用下图来说明吧:
可以看出向a 添加一个元素,通过浅拷贝的b也随着改了,但是通过深拷贝的c没改,可以判断c和a指向不同的内存地址。
多层嵌套的情况
如果是类似这种结构的数据的深拷贝呢:
深拷贝d时其实把a里面的a,b都深拷贝了一份,是递归式的深拷贝。
通过验证就是如图所示:
3、=赋值操作
另外说一下=赋值操作,a=b这时这两个变量完全相同包括值和地址,完全一样
其中一个变化,另一个也会随之变化,不论是内层还是外层,二者保持完全一样
4、例题加深印象
例一
例二
温故而知新,勤加复习