Python 中字典赋值与引用的深层机制:为什么修改同一对象会影响所有引用?

发布时间 - 2026-02-02 00:00:00    点击率:

python 字典是可变对象,赋值操作(如 `a = b`)仅复制引用而非数据本身;只有重新绑定变量(如 `d = {}`)才会切断原有引用,而原地修改(如 `d[key] = val`)则会同步影响所有指向该字典的变量。

在 Python 中,理解“赋值即引用”是避免意外数据共享的关键。当你执行 dictionary1 = dictionary2,实际发生的是 dictionary1

和 dictionary2 共同指向内存中同一个字典对象——它们不是两个独立副本,而是同一本字典的两个“书签”。

这解释了你观察到的第一个代码片段的问题:

set1 = {}  # ✅ 创建一个空字典对象,set1 指向它
for i in s1:
    for j in range(1, len(i)):
        set1[i[j][0]] = i[j][1]  # ⚠️ 原地修改:向同一个字典添加/更新键值对
    set2[i[0]] = set1           # ⚠️ 赋值引用:set2[i[0]] 指向 set1 当前所指的同一对象

由于 set1 = {} 只在循环外执行一次,整个循环中 set1 始终引用同一个字典对象。每次 set2[i[0]] = set1 都只是把该对象的引用存入 set2 的不同键下。最终 set2 的所有值都指向同一个字典——最后一次循环写入的内容覆盖了之前所有修改,导致所有键对应相同的最终状态。

而第二个版本正确解决了这个问题:

for i in s1:
    set1 = {}  # ✅ 每次迭代都创建一个全新的字典对象
    for j in range(1, len(i)):
        set1[i[j][0]] = i[j][1]  # ✅ 修改的是本次新建的独立字典
    set2[i[0]] = set1           # ✅ 存入的是这个新字典的独立引用

此处 set1 = {} 在每次循环开始时执行,意味着为每个 i 分配了一个全新、隔离的字典对象。因此 set2[i[0]] 存储的是彼此无关的引用,最终得到预期结构 {name: {value: pair, ...}, name2: {...}}。

⚠️ 注意:这种引用行为仅适用于可变对象(dict, list, set 等)。对于不可变对象(如 int, str, tuple),赋值后重新绑定变量(如 x = 5; x = 10)不会影响其他变量,因为它们本质上是创建新对象并重定向引用——这正是你第二个例子中 dictionary2 = {1:'f', 2:'g'} 不影响 dictionary1 的原因:dictionary2 已被重新绑定到一个新字典,而 dictionary1 仍牢牢指向原来的那个。

✅ 正确实践建议:

  • 若需多个独立副本,请在每次使用前显式创建(如 d = {} 或 d = dict());
  • 若需深拷贝嵌套结构,使用 copy.deepcopy();
  • 可通过 id(obj) 快速验证两个变量是否指向同一对象(id(a) == id(b) 返回 True 即为同一对象)。

理解引用与对象生命周期,是写出健壮、可预测 Python 代码的基础。


# python  # ai  # 键值对  # 为什么  # int  # 循环  # copy  # 对象  # 的是  # 绑定  # 第二个  # 创建一个  # 若需  # 第一个  # 多个  # 才会  # 已被  # 当你 


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


相关推荐: 专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何在IIS中新建站点并配置端口与物理路径?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何在云虚拟主机上快速搭建个人网站?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  常州企业网站制作公司,全国继续教育网怎么登录?  javascript读取文本节点方法小结  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  高性价比服务器租赁——企业级配置与24小时运维服务  如何选择PHP开源工具快速搭建网站?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  微信小程序 闭包写法详细介绍  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  js实现点击每个li节点,都弹出其文本值及修改  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  如何快速登录WAP自助建站平台?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel如何使用Blade组件和插槽?(Component代码示例)  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel如何使用Livewire构建动态组件?(入门代码)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  香港服务器部署网站为何提示未备案?  如何解决hover在ie6中的兼容性问题  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何在阿里云购买域名并搭建网站?  JS经典正则表达式笔试题汇总  Laravel如何处理CORS跨域请求?(配置示例)  Laravel distinct去重查询_Laravel Eloquent去重方法  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何在阿里云虚拟服务器快速搭建网站?