预备知识
对象的三个属性
python中每一个对象都有三个属性:唯一标志,类型和值。
其中对象的标志是一串数字,是每个对象的唯一标识,位于同一地址的对象标志相同。对象的值相等和标志相等判断方法如下:
id(s)
查看对象的标志is
is not
判断两个对象的标志是否相同。==
判断对象的值是否相同。
可变对象和不可变对象
“可变”,指改变对象的值后对象的标志(地址)是否会发生改变。如果改变列表、字典、集合(可变对象)的内容,会在相应地址上关联数值,其标志不会改变。如果改变不可变对象的值,该对象的标志一定发生改变。
不可变对象:int、float、str、bool、tuple。
可变对象:list、dict、set。
浅拷贝
浅拷贝函数:a = copy.copy(x)
。是对对象外层(父级)的拷贝,不拷贝内部(子级)。可以分为:
- x最外层不可变,则浅拷贝时:a会直接引用x的地址空间,id(a) == id(x)。
- x最外层可变,则浅拷贝时:会给a开辟一个新的地址空间,存放x内部的值,id(a) != id(x),但是x内层的标志拷贝到a中。
深拷贝
深拷贝函数:a = copy.deepcopy(x)
。是对内层和外层的全部拷贝,与浅拷贝不同的是:
- x外层数据类型不可变,里面是可变数据类型,会新开辟地址空间存放,id(a) != id(x)。
- x外层数据类型不可变,里面是不可变数据类型,则如同浅拷贝,id(a) == id(x)。
总结
深和浅的区别在于是否会给拷贝返回对象开辟一片新地址。对于可变对象,不论何种拷贝都会开辟一片新的地址;而不可变对象,若内层可变,深拷贝会开辟新的地址存放拷贝内容,否则都是引用原来对象的地址。
python之深拷贝和浅拷贝
python中的深拷贝和浅拷贝