https://www.cnblogs.com/sun-haiyu/p/7096918.html
一,Python中的可变对象和不可变对象
不可变对象
该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
可变对象
该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。
Python中,
不可变类型:数值类型(int和float)、字符串str、元组tuple
可变类型:列表list、字典dict、集合set
https://www.jianshu.com/p/03dce38cc97e
二,引用指向、深拷贝与浅拷贝
引用指向
例如:
a = [1, 2]
b = a
这种赋值id(a) = id(b),不论可变数据类型还是不可变数据类型
浅拷贝,copy模块里面的copy方法实现
1、对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。
2、对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
3、浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。(操作拷贝对象对原始对象的也是同理)
4、list[:]、dict.copy()类似于浅拷贝操作。
深拷贝,copy模块里面的deepcopy方法实现
1、如果每一层都是不可变类型,深拷贝依然拷贝的是引用,不会创建新的内存。
2、如果有一层是可变对象,则深拷贝会拷贝每一层,新建内存。
总结:
1、如果变量内部的数据每一层都是不可变类型,深拷贝和浅拷贝都是地址指向
2、如果变量最外层是可变类型,浅拷贝会拷贝最外层,开辟新的空间,id改变;深拷贝会拷贝所有的可变类型,开辟新的空间,id改变。
3、如果变量数据的最外层是不可变类型,内部包含有可变数据,浅拷贝会对最外层做地址指向,id不变;深拷贝开辟新的空间,id改变,并拷贝内部所有的可变类型。