参考:https://docs.python.org/zh-cn/3/library/copy.html

介绍

Python copy模块包括copy()和deepcopy()两函数。

copy.copy(x): 返回 x 的浅层(shallow)复制。

copy.deepcopy(x[memo]): 返回 x 的深层复制。

代码示例

import copy

#列表
a = [1,2,[5,4]]
a1 = copy.copy(a)
a2 = copy.deepcopy(a)
print(a1) #[1, 2, [5, 4]]
print(a2) #[1, 2, [5, 4]]

#改变列表最外层的元素不会影响shallow copy和deep copy的结果
a[0] = "YY"
print(a)  #['YY', 2, [5, 4]]
print(a1) #[1, 2, [5, 4]]
print(a2) #[1, 2, [5, 4]]

#改变第二层列表的元素不会影响deep copy的结果,shallow copy的结果会受到影响
a[2][0] = "XX"
print(a)  #['YY', 2, ['XX', 4]]
print(a1) #[1, 2, ['XX', 4]]
print(a2) #[1, 2, [5, 4]]


#字典
b = {"name":"ZZ", "pets": ["tantan","lele"]}
b1 = copy.copy(b)
b2 = copy.deepcopy(b)
print(b1) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}
print(b2) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}

#改变字典最外层的键值对不会影响shallow copy和deep copy的结果
b["age"] = 10 #在字典最外层增加键值对
print(b)  #{'name': 'ZZ', 'pets': ['tantan', 'lele'], 'age': 10}
print(b1) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}
print(b2) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}

del b["name"] #删除字典最外层删除键值对,del b["pets"]
print(b)  #{'pets': ['tantan', 'lele'], 'age': 10}
print(b1) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}
print(b2) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}

#改变字典中列表的元素不会影响deep copy的结果,shallow copy的结果会受到影响
b["pets"].append("huahua") 
print(b)  #{'pets': ['tantan', 'lele', 'huahua'], 'age': 10}
print(b1) #{'name': 'ZZ', 'pets': ['tantan', 'lele', 'huahua']}
print(b2) #{'name': 'ZZ', 'pets': ['tantan', 'lele']}

总结

deep copy对象是独立于原object存在的,也就是说原object的任何改变都不会引起deepcopy()对象的改变;

shallow copy对象不是完全独立于原object,原object内二级对象(比如字典或列表内的字典或列表)的改变会引起shallow copy对象改变。