Python对象拷贝机制_copy模块说明【指导】

16次阅读

python对象拷贝分浅拷贝和深拷贝:浅拷贝只复制顶层,嵌套对象仍共享引用;深拷贝递归复制所有层级,完全独立。=赋值仅为引用,不产生新对象。

Python对象拷贝机制_copy模块说明【指导】

Python中对象拷贝不是简单的“复制一份”,而是分浅拷贝(shallow copy)和深拷贝(deep copy),关键看是否递归复制嵌套对象。直接用=只是赋新引用,原对象改了,新变量也跟着变。

浅拷贝:只复制顶层,嵌套对象仍共享

浅拷贝创建一个新对象,但内部可变对象(如列表里的子列表、字典里的值)仍是原对象的引用。修改嵌套内容会影响原对象。

  • 适用场景:对象结构扁平,或你明确希望内层共享;比如临时备份配置字典,但其中的缓存列表本就该共用
  • 常用方法
    • copy.copy(obj)
    • obj.copy()(仅对dict、list、set等内置类型有效)
    • obj[:](仅限列表切片
    • list(obj)dict(obj)构造函数

深拷贝:完全独立,递归复制所有层级

深拷贝会递归遍历整个对象树,为每个子对象都创建新副本。修改拷贝后的任意层级,都不会影响原始对象。

  • 适用场景:对象含多层嵌套(如列表里有字典,字典里又有列表),且需要彻底隔离;比如做实验性数据处理、回滚前快照
  • 注意点
    • 性能开销大,尤其对象庞大或存在循环引用时
    • 某些对象无法深拷贝(如打开的文件、线程锁、Lambda函数),会抛TypeError
    • 使用copy.deepcopy(obj)即可,无需额外参数(除非自定义__deepcopy__

如何判断该用哪种?看“改了会不会互相影响”

动手前快速验证:修改拷贝体的某一层,再检查原对象对应位置是否变化。

立即学习Python免费学习笔记(深入)”;

  • 如果只改最外层(如列表追加元素),原对象不变 → 浅拷贝已够用
  • 如果改了内层(如copied_list[0].append(99)),原对象original_list[0]也多了99 → 必须用深拷贝
  • 不确定结构深度?保守起见用deepcopy,但记得加注释说明原因

自定义类支持拷贝:实现__copy____deepcopy__

默认情况下,copy.copydeepcopy对自定义类会尝试调用这两个特殊方法。不实现则按默认逻辑(浅拷贝字段、深拷贝字段值)。

  • __copy__(self)接收一个memo字典(深拷贝用),返回新实例,通常手动复制各字段
  • __deepcopy__(self, memo)需显式调用copy.deepcopy(value, memo)处理每个字段,避免无限递归
  • 常见模式:用__dict__.copy()做浅拷贝基础,再逐个处理需深拷贝的属性
text=ZqhQzanResources