导航

13.python中拷贝

Posted on 2025-03-03 15:04  小熊_努力学习版  阅读(70)  评论(0)    收藏  举报

在Python中,直接赋值、(需要导入copy库)浅拷贝(copy.copy)和深拷贝(copy.deepcopy)是处理对象复制的三种不同方式,它们的核心区别在于内存引用层级对象独立性。以下是详细对比:


一、直接赋值 (=)

a = [1, 2, [3, 4]]
b = a  # 直接赋值

特点:

  1. 完全共享内存ba 指向同一个内存对象
  2. 完全联动:任何修改(包括嵌套对象)都会互相影响
  3. 内存地址相同id(a) == id(b)

示例:

a[0] = 100
print(b)  # [100, 2, [3,4]] → b随a改变

a[2].append(5)
print(b[2])  # [3,4,5] → 嵌套对象也被修改

二、浅拷贝 (copy.copy)

import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)  # 浅拷贝

特点:

  1. 创建新容器对象:外层对象是新的(id(a) != id(b)
  2. 共享子对象引用:嵌套的可变对象仍指向原内存
  3. 适用场景:单层结构(无嵌套可变对象)

示例:

a[0] = 100
print(b)  # [1, 2, [3,4]] → 外层修改不影响b

a[2].append(5)
print(b[2])  # [3,4,5] → 嵌套对象仍被修改!

三、深拷贝 (copy.deepcopy)

import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)  # 深拷贝

特点:

  1. 完全独立对象:递归复制所有层级对象
  2. 内存完全隔离:任何修改互不影响
  3. 资源消耗较大:适用于复杂嵌套结构

示例:

a[0] = 100
print(b)  # [1, 2, [3,4]] → 外层无影响

a[2].append(5)
print(b[2])  # [3,4] → 嵌套对象也无影响

四、对比总结表格

操作 内存独立性 嵌套对象处理 性能消耗 典型使用场景
直接赋值 (=) 完全不独立 共享所有层级引用 需要完全联动的对象
浅拷贝 外层独立 共享嵌套对象引用 单层结构(如普通列表)
深拷贝 完全独立 递归创建所有新对象 多层嵌套结构(如树形数据)

五、特殊注意事项

  1. 不可变对象优化

    # 对于不可变对象(如元组),浅拷贝可能不会创建新对象
    a = (1, 2, 3)
    b = copy.copy(a)  # id(a) == id(b)
    
  2. 循环引用处理

    a = [1,2]
    a.append(a)  # 创建循环引用
    b = copy.deepcopy(a)  # 能正确处理循环引用
    
  3. numpy与pandas数据类型的复制

  • numpy数组:arr.copy(),创建完全独立的副本,也就是deepcopy
  • pandas二维数据表格:'df.copy(deep = True)'默认是True,也就是默认为深拷贝。

掌握这些区别可以避免以下常见错误:

  • 误用浅拷贝导致嵌套数据意外修改
  • 对大型数据结构的深拷贝造成内存浪费
  • 在多线程环境中共享可变对象导致数据竞争