Python列表深拷贝浅拷贝区别_copy与deepcopy解析【技巧】

发布时间 - 2025-12-29 00:00:00    点击率:
浅拷贝只复制第一层,嵌套对象仍共享引用;深拷贝递归复制所有层级,彻底隔离嵌套结构;eval(repr(x))模拟深拷贝危险且低效,应优先使用copy.deepcopy()并确认必要性。

浅拷贝只复制第一层,嵌套对象仍共享引用

当你用 copy.copy() 或切片 list[:]list.copy() 复制一个含嵌套列表的 Python 列表时,外层数组是新的,但内部子列表仍是原对象的引用。修改子列表会同步影响原列表。

  • 适用场景:列表里全是不可变对象(如 intstrtuple),或你明确希望子对象共享
  • 常见错误现象:
    original = [[1, 2], 3]
    shallow = original.copy()
    shallow[0].append(3)
    print(original)  # 输出 [[1, 2, 3], 3] —— 原列表被意外改了
  • copy.copy()list.copy() 行为一致,但后者仅限 list 类型

深拷贝递归复制所有层级,彻底隔离嵌套结构

copy.deepcopy() 会逐层遍历并新建所有可变对象(包括嵌套的 listdictset 等),确保新旧对象完全独立。

  • 适用场景:需要完全隔离的副本,尤其处理配置、测试数据、递归结构时
  • 性能影响:深度嵌套或含大量对象时明显变慢,且无法处理循环引用(会抛 RecursionError
  • 注意兼容性:deepcopy 对自定义类需实现 __reduce____getstate__ 才能正确还原状态

不推荐用 eval(repr(x)) 模拟深拷贝

有人用 eval(repr(x)) 尝试“序列化再重建”,这非常危险:

  • 若列表含函数、模块、文件对象等,repr() 不返回可执行字符串,eval 直接报错
  • 字符串中含特殊字符(如换行、单引号嵌套)会导致语法错误
  • 存在任意代码执行风险(如果 x 来自不可信输入)
  • 性能远低于 deepcopy,且类型可能丢失(如 numpy.ndarray 变成普通 list

真正需要深拷贝时,优先用 copy.deepcopy(),但先确认是否真有必要

很多场景其实只需浅拷贝——比如临时修改参数、构造中间结果。盲目用 deepcopy 容易掩盖设计问题,还拖慢性能。

  • 检查是否真的修改了嵌套内容;如果只是替换整个子列表(new[0] = [4,5]),浅拷贝已足够
  • 对简单结构(如二维列表),手动重建更清晰:
    deep_copy = [sublist[:] for sublist in original]
  • 若频繁深拷贝大对象,考虑用不可变数据结构(如 tuple 嵌套)或改用 dataclasses.replace() + 冻结实例

嵌套可变对象的生命周期和所有权容易被忽略,这是深浅拷贝问题最常出错的地方。


# python  # app  # 区别  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Angular 表单中正确绑定输入值以确保提交与验证正常工作  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何生成URL和重定向?(路由助手函数)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel如何实现本地化和多语言支持?(i18n教程)  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  5种Android数据存储方式汇总  微信推文制作网站有哪些,怎么做微信推文,急?  如何为不同团队 ID 动态生成多个非值班状态按钮  Android okhttputils现在进度显示实例代码  如何用腾讯建站主机快速创建免费网站?  如何在云服务器上快速搭建个人网站?  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  北京网站制作公司哪家好一点,北京租房网站有哪些?  网站页面设计需要考虑到这些问题  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  免费视频制作网站,更新又快又好的免费电影网站?  如何撰写建站申请书?关键要点有哪些?  手机网站制作与建设方案,手机网站如何建设?  如何快速搭建高效香港服务器网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何彻底卸载建站之星软件?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何破解联通资金短缺导致的基站建设难题?  如何挑选最适合建站的高性能VPS主机?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何正确选择百度移动适配建站域名?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何实现API资源集合?(Resource Collection教程)  Python自动化办公教程_ExcelWordPDF批量处理案例  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何选择可靠的免备案建站服务器?  Android自定义控件实现温度旋转按钮效果  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  移动端脚本框架Hammer.js  Python进程池调度策略_任务分发说明【指导】