Python copy模块

Posted chaimy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python copy模块相关的知识,希望对你有一定的参考价值。

参考: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对象改变。

以上是关于Python copy模块的主要内容,如果未能解决你的问题,请参考以下文章

python中copy模块

Python copy模块

python 深复制与浅复制------copy模块

python模块之copy

python之copy模块与深浅拷贝

python之copy模块与深拷贝浅拷贝