Python 中赋值语句 不复制对象 ,而是在目标和对象之间创建 绑定(bindings) 关系。对于自身可变或者包含可变项的集合对象,开发者有时会需要生成其副本用于改变操作,进而避免改变原对象。
官方文档,本模块提供了通用的浅层复制和深层复制操作:
copy.copy()
- 浅拷贝,拷贝父对象,不会拷贝对象的内部的子对象,也就是子对象公用
- 如果子对象是不可变数据类型,那么复制的对象和原来的对象互不影响
- 如果子对象是可变数据类型,那么复制的对象是原来对象的引用
- 浅拷贝,拷贝父对象,不会拷贝对象的内部的子对象,也就是子对象公用
copy.deepcopy()
- 深拷贝,完全拷贝父对象和子对象,复制的对象和原来对象互不关联
# 关于拷贝的机制
import copy
a=[1,2,3,['a','b']] #原始对象
b=a #赋值,传对象的引用
c=copy.copy(a) #浅拷贝
d=copy.deepcopy(a) #深拷贝
a.append(5)
a[3].append('c')
print(a)
# -->[1, 2, 3, ['a', 'b', 'c'], 5]
print(b)
# -->[1, 2, 3, ['a', 'b', 'c'], 5]
print(c)
# -->[1, 2, 3, ['a', 'b', 'c']]
print(d)
# -->[1, 2, 3, ['a', 'b']]
#关于同数据,字符串+=
a="abc"
b=a
print(id(a),id(b)) #-->1652389179952 1652389179952
c="abc"
d=""
d+=c
print(id(c),id(d)) #-->1652389179952 1652389179952
print(d) #-->abc
d+=c
print(d,id(d),id(c))#-->abcabc 1652431257904 1652389179952