Python 引用/浅拷贝/深拷贝
1.前置知识,可变类型和不可变类型
不可变类型: 不可变类型对象一旦创建,其值不可修改.任何修改操作实际会创建新的对象,原对象会保持不变. 整数/浮点数/复数/字符串/元组/布尔值,元组本身是不可变的,但是如果包含可变元组(如列表),其内容可被间接修改. 可变类型: 可变类型对象可以直接修改,内存地址不变. 列表/字典/集合/字节数组
2.引用
a = [1,2,[3,4]] b = a # a,b变量指向同一个对象,没有创建新的对象.
3.浅拷贝
import copy a = [1,2,[3,4]] b = copy.copy(a) # 浅拷贝只拷贝父对象,不拷贝对象的子对象. # 拷贝a对象时,会创建一个新的对象(有自己的内存地址),将a对象拷贝过去,对于a对象的子对象,不会进行拷贝. # 即, b与a不指向同一个对象,但是a内部的引用,b直接复用.
4.深拷贝
import copy a = [1,2,[3,4]] b = copy.deepcopy(a) # 深拷贝会递归拷贝原对象. # 对于不可变类型,拷贝不会创建新的对象,而是直接返回引用,这是由于不可变类型的特性,直接返回引用也是安全的,且能减少内存占用,这也是python的特性. # 对于可变类型,拷贝会创建新的对象,然后引用这个新的对象. # 遵循上面的规则,深拷贝会递归地拷贝对象中的所有层级的子对象.
5.特殊情况
元组是不可变类型,
浅拷贝时,会直接返回引用,不管里面是不是有可变类型的对象.
深拷贝时,如果内部都是不可变类型的对象,那么也是直接返回引用;如果内部有可变类型的对象,那么会创建新的对象.
浙公网安备 33010602011771号