Python 深拷贝和浅拷贝到底差在哪?6 个让你半夜 debug 的案例 + 对照表

简介: 浅拷贝只复制第一层,嵌套的可变对象(list/dict/set)仍共享同一块内存;深拷贝递归复制所有层,新旧对象彻底解耦。6 个半夜 debug 的真实案例 + 对照表,把 copy.copy / copy.deepcopy 的坑一次讲清。

Python 深拷贝和浅拷贝到底差在哪?6 个让你半夜 debug 的案例 + 对照表

系列:Python 底层设计逻辑|类型:排错清单型|分发:CSDN / 掘金 / 51CTO / 阿里云 / 知乎
字数:约 1500 字

结论先行:Python 里 copy.copy() 是浅拷贝,copy.deepcopy() 是深拷贝。浅拷贝只复制"第一层",嵌套的可变对象(list/dict/set)仍然共享同一块内存;深拷贝会递归复制所有层,新旧对象彻底解耦。90% 的"我改了 A,B 怎么也变了"都是浅拷贝埋的雷。


1. 最直观的反例:改一个,另一个跟着变

import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)          # 浅拷贝
b[2].append(5)
print(a)                  # [1, 2, [3, 4, 5]]  ← a 也被改了!

关键:b[2] 这个内层列表没有被复制,a 和 b 指向同一个内层列表对象。

2. 浅拷贝"只保第一层"到底保了什么

import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
b[0] = 99
print(a)                  # [1, 2, [3, 4]]  ← 这一层没事

为什么:外层容器(a 这个 list 本身)是新对象;但元素里,不可变对象(int)天然独立,可变对象(内层 list)只复制了"引用"。所以改 b[0] 安全,改 b[2] 危险。

3. 深拷贝:彻底解耦

import copy
a = [1, 2, [3, 4]]
c = copy.deepcopy(a)
c[2].append(5)
print(a)                  # [1, 2, [3, 4]]  ← 完全不受影响
print(c)                  # [1, 2, [3, 4, 5]]

代价:深拷贝递归复制每一层,对象大/层级深时明显更慢、更占内存。不是无脑上深拷贝,而是"需要隔离时才用"。

4. 函数默认参数的经典陷阱

def add_item(x, items=[]):   # 默认参数是模块加载时创建的同一个 list
    items.append(x)
    return items

print(add_item(1))           # [1]
print(add_item(2))           # [1, 2]  ← 坑!

解法:items=None 后在函数内 items = items or [],本质就是避开"共享可变默认对象"。

5. 切片和 dict 推导 ≠ 深拷贝

a = [[1], [2]]
b = [x for x in a]           # 列表推导仍是浅拷贝!
b[0].append(9)
print(a)                     # [[1, 9], [2]]  ← 还是中招

对照:b = a[:]、list(a)、{**d} 全是浅拷贝。想深,必须 deepcopy。

6. 自定义对象:只拷 __dict__ 吗?

copy 模块对自定义类:浅拷贝新建实例并复制 __dict__(仍是引用共享);深拷贝递归处理。若对象持有文件句柄、锁、socket,深拷贝会报错或失去意义——这类对象要自己实现 __copy__ / __deepcopy__。


对照表:一眼分清

维度 赋值 = 浅拷贝 copy() 深拷贝 deepcopy()
外层容器 同一对象 新对象 新对象
内层可变元素 共享 共享 独立
速度 最快 快 慢(递归)
内存 最小 小 大
适用 不想复制 扁平结构/只读共享 需要完全隔离

排错清单(收藏级)

  • 怀疑浅拷贝中招:先 id(a[2]) == id(b[2]) 验证内层是否同一对象。
  • 想要隔离:直接 deepcopy,别用推导式/list()/[:] 假装拷贝。
  • 默认参数:永远用 None 占位,函数内初始化。
  • 超大嵌套:评估 deepcopy 性能,必要时手动控制拷贝深度。
  • 含资源句柄的对象:手写 __deepcopy__,别交给默认递归。

一句话记住:浅拷贝是"换个壳子装旧货",深拷贝是"连货带壳全重做"。改了嵌套还串味,八成是浅了。

相关文章
|
18小时前
|
人工智能 监控 安全
AI 应用接入:API Key 的归属、授权与调用验证
本文基于阿里云API网关与百炼模型服务,提出一套API Key全生命周期管理实践:涵盖调用主体与项目归属划分、两类凭证(DashScope API Key与AccessKey)区分、RAM授权策略配置、有效期管控及日志核对验证,助力团队安全、可溯、可计量地使用大模型服务。(239字)
20 0
|
7月前
|
人工智能 Linux API
OpenClaw全自动小红书运营实战:从0到1全流程部署、技能配置与内容自动化发布指南
在内容自动化运营场景中,OpenClaw(Clawdbot)凭借高度可扩展的Skill体系与多任务执行能力,可实现从热点追踪、文案创作、封面生成到笔记发布、互动管理的全流程自动化。本文基于2026年最新环境,完整讲解如何通过阿里云轻量服务器或本地Windows11/macOS/Linux部署OpenClaw,安装并配置小红书运营Skill,完成Cookie登录、内容生成、笔记发布、数据监控,并接入阿里云百炼Coding Plan免费大模型与QMD记忆优化系统,实现低成本、7×24小时无人值守小红书运营。全文无营销词汇,所有命令可直接复制,零基础用户也能快速跑通全流程。
3392 9
|
2月前
|
人工智能 缓存 自然语言处理
阿里云百炼模型订阅怎么选?Token Plan、Coding Plan与Night Plan节省计划对比指南
阿里云百炼作为一站式大模型服务平台,提供了丰富的订阅计划与模型服务,覆盖个人开发、团队协作、企业级应用等全场景。从面向个人开发者的Coding Plan,到团队协同的Token Plan,再到夜间特惠的Night Plan与成本优化的AI通用节省计划,不同计划在计费模式、模型支持、使用限制上差异显著。本文将系统拆解百炼四大核心订阅计划,详解Qwen系列模型能力差异,提供完整API接入代码与配置流程,并给出不同场景下的选型与省钱策略,帮助开发者与企业高效、低成本使用大模型服务。
353 1
|
3月前
|
人工智能 JSON 缓存
阿里云百炼Token Plan团队版完整解析:功能、模型、套餐与使用规范解读
阿里云百炼Token Plan团队版是百炼平台面向企业、开发团队推出的预付费大模型订阅服务,整体以统一Credits信用点作为全模型调用计量单位,整合通义千问、DeepSeek、Kimi、GLM、MiniMax等多厂商文本、视觉、图像生成大模型,原生兼容各类AI编程工具与自主Agent智能体框架,专门适配交互式人工使用场景。
477 1
|
3月前
|
人工智能 分布式计算 大数据
活动报名 | Agentic Lakehouse Meetup · 北京站,从开源技术创新到多模态数据智能化
8月14日,阿里云在北京举办“Agentic Lakehouse”技术活动,聚焦开源大数据生态如何支撑AI Agent全生命周期。
445 2
活动报名 | Agentic Lakehouse Meetup · 北京站,从开源技术创新到多模态数据智能化
|
3月前
|
消息中间件 人工智能 监控
高并发下 AI Agent 策略:分布式 Agent 系统的架构设计
本文探讨AI Agent在高并发场景下的系统架构挑战与设计策略,涵盖事件驱动架构、消息队列调度、Agent池化、模型服务独立部署、Continuous Batching、RAG优化、上下文管理及成本控制等核心要点,助力构建稳定高效的生产级智能体系统。
466 1
|
3月前
|
人工智能 自然语言处理 机器人
AI Agent 工程实践:从大语言模型到自主任务执行系统的架构演进
AI Agent 是让大模型从“能聊”走向“能干”的关键架构:它融合感知、规划、工具调用、记忆与反馈,构建可执行复杂任务的智能系统。不同于聊天机器人,Agent 能自主拆解目标、调用API、跨步执行并持续优化,正成为企业智能化的新基建。
582 3
|
3月前
|
人工智能 自然语言处理 API
大模型企业本地化部署与数据安全实践:知识库过期内容如何治理
企业大模型本地化部署中,知识库内容过期易致“看似正确实则失效”的回答。本文聚焦数据安全与治理,提出版本管理、状态标识(有效/归档)、生效时间、替代关系等元数据规范,并结合审核流程、提示词约束与分层架构,构建可追溯、可更新、可下线的知识库闭环治理体系。
360 1
大模型企业本地化部署与数据安全实践:知识库过期内容如何治理
|
2月前
|
存储 运维 安全
医疗内网纵深防御安全体系实战方案
本文剖析医疗内网“终端失控、边界模糊、数据泄露”三大痛点,结合等保2.0与《数据安全法》要求,提出以身份为核心、数据为资产的纵深防御方案:涵盖网络准入控制、终端全生命周期管理、安全数据交换、外设精细化管控等闭环措施,兼顾业务连续性与合规达标。
|
1月前
|
SQL 存储 人工智能
Ossie ,会不会成为“开源 Palantir”的起点?
如果企业未来确实需要走向本体论,语义层很可能不是一个迟早要被替换掉的过渡方案,而是一条更现实的建设起点。

热门文章

最新文章