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]}