Python标准库之copy

1. copy标准库简介

Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系。对于自身可变或者包含可变项的集合对象,我们有时会需要生成其副本用于改变操作,进而避免改变原对象。

2. copy常用函数

2.1 copy.copy(x)

对任意Python对象做浅拷贝操作

2.2 copy.deepcopy(x, memo=None, _nil=[])

对任意Python对象做深拷贝操作

2.3 浅拷贝和深拷贝使用对比

浅层复制和深层复制之间的区别仅与复合对象 (即包含其他对象的对象,如列表或类的实例) 相关:

  • 一个 浅层复制 会构造一个新的复合对象,然后(在可能的范围内)将原对象中找到的 引用 插入其中。
  • 一个 深层复制 会构造一个新的复合对象,然后递归地将原始对象中所找到的对象的 副本 插入。
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))

Python标准库之copy_第1张图片

3.参考文献

  • copy — 浅层 (shallow) 和深层 (deep) 复制操作 — Python 3.7.13 文档

你可能感兴趣的:(Python,python,标准库,copy,浅拷贝,深拷贝)