Python 中字典赋值与引用的深层机制:为什么修改同一对象会影响所有引用?
发布时间 - 2026-02-02 00:00:00 点击率:次python 字典是可变对象,赋值操作(如 `a = b`)仅复制引用而非数据本身;只有重新绑定变量(如 `d = {}`)才会切断原有引用,而原地修改(如 `d[key] = val`)则会同步影响所有指向该字典的变量。
在 Python 中,理解“赋值即引用”是避免意外数据共享的关键。当你执行 dictionary1 = dictionary2,实际发生的是 dictionary1

这解释了你观察到的第一个代码片段的问题:
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去重方法
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在阿里云虚拟服务器快速搭建网站?

