随笔 - 14, 文章 - 0, 评论 - 0, 阅读 - 209

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

13.python中拷贝

Posted on   小熊_努力学习版  阅读(3)  评论(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,也就是默认为深拷贝。

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

  • 误用浅拷贝导致嵌套数据意外修改
  • 对大型数据结构的深拷贝造成内存浪费
  • 在多线程环境中共享可变对象导致数据竞争
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示