Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系。对于自身可变或者包含可变项的集合对象,我们有时会需要生成其副本用于改变操作,进而避免改变原对象。
copy.copy(x)
对任意Python对象做浅拷贝操作
copy.deepcopy(x, memo=None, _nil=[])
对任意Python对象做深拷贝操作
浅层复制和深层复制之间的区别仅与复合对象 (即包含其他对象的对象,如列表或类的实例) 相关:
import copy
# 1.创建包含可变对象list的复合对象
tup=(1,1.2,2+3j,["hello","world"])
# 2.创建自身可变的复合对象
ls=["cyr",0xfff,2e-3,[5,"day"]]
# 对1.做浅拷贝和深拷贝
shallow_copy_tup,deep_copy_tup=copy.copy(tup),copy.deepcopy(tup)
# 对2.做浅拷贝和深拷贝
shallow_copy_ls,deep_copy_ls=copy.copy(ls),copy.deepcopy(ls)
"""
is关键字用于判断是否是一个对象,即内存地址是否一致
==关系运算符用于判断两个对象的逻辑相等性,即内容是否相同
"""
print("""
浅拷贝与包含可变对象list的原始复合对象是否是一个对象?{} 内容是否相同?{}
深拷贝与包含可变对象list的原始复合对象是否是一个对象?{} 内容是否相同?{}
浅拷贝与自身可变的原始复合对象是否是一个对象?{} 内容是否相同?{}
深拷贝与自身可变的原始复合对象是否是一个对象?{} 内容是否相同?{}
""".format(shallow_copy_tup is tup,shallow_copy_tup==tup,deep_copy_tup is tup,deep_copy_tup==tup,
shallow_copy_ls is ls,shallow_copy_ls==ls,deep_copy_ls is ls,deep_copy_ls==ls))
# 对原始复合对象做修改
tup[-1].append("Python")
ls[-1].append(2022)
print("""
修改包含可变对象list的原始复合对象后为{}
浅拷贝为{}
深拷贝为{}
修改自身可变的原始复合对象后为{}
浅拷贝为{}
深拷贝为{}
""".format(tup,shallow_copy_tup,deep_copy_tup,ls,shallow_copy_ls,deep_copy_ls))