Python 直接赋值、浅拷贝和深度拷贝解析


Python 直接赋值、浅拷贝和深度拷贝解析

直接赋值

对象的引用(别名) —— 父子共用

实例:

>>> a = {1:[1,2,3]}
>>> b = a
>>> # 修改父对象,给父对象添加元素,同时影响 a 和 b
>>> b[2] = [4, 5, 6]
>>> print("a=",a,",b=",b)
a= {1: [1, 2, 3], 2: [4, 5, 6]} ,b= {1: [1, 2, 3], 2: [4, 5, 6]}
>>> # 修改内部子对象,给子对象添加元素,同时影响 a 和 b
>>> b[1].append(7)
>>> print("a=",a,",b=",b)
a= {1: [1, 2, 3, 7], 2: [4, 5, 6]} ,b= {1: [1, 2, 3, 7], 2: [4, 5, 6]}

解释分析:
b = a: 赋值引用,a 和 b 都指向同一个对象。

直接赋值解析

浅拷贝(copy)

拷贝父对象,不会拷贝对象的内部子对象 —— 父隔离,子公用

实例:

>>> import copy
>>> a = {1: [1, 2, 3]}
>>> b = copy.copy(a)  # 等同于 b = a.copy()
>>> # 修改父对象,给父对象添加元素,只影响 b,不影响 a
... b[2] = [4, 5, 6]
>>> print("a=",a,",b=",b)
a= {1: [1, 2, 3]} ,b= {1: [1, 2, 3], 2: [4, 5, 6]}
>>> # 修改对象内部子对象,给子对象添加元素,同时影响 a 和 b
... b[1].append(7)
>>> print("a=",a,",b=",b)
a= {1: [1, 2, 3, 7]} ,b= {1: [1, 2, 3, 7], 2: [4, 5, 6]}

浅拷贝解析

深拷贝(deepcopy)

copy模块的 deepcopy 方法,完全拷贝了父对象及其子对象 —— 父子隔离

实例:

>>> import copy
>>> a = {1: [1, 2, 3]}
>>> b = copy.deepcopy(a)
>>> # 修改父对象,给父对象添加元素,只影响 b,不影响 a
... b[2] = [4, 5, 6]
>>> print("a=",a,",b=",b)
a= {1: [1, 2, 3]} ,b= {1: [1, 2, 3], 2: [4, 5, 6]}
>>>
>>> # 修改对象内部子对象,给子对象添加元素,只影响 b,不影响 a
... b[1].append(7)
>>> print("a=",a,",b=",b)
a= {1: [1, 2, 3]} ,b= {1: [1, 2, 3, 7], 2: [4, 5, 6]}

深拷贝解析


文章作者: pudding
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 pudding !
  目录