0

0

Python 中字典赋值的引用机制与可变对象行为详解

心靈之曲

心靈之曲

发布时间:2026-02-02 20:15:01

|

478人浏览过

|

来源于php中文网

原创

Python 中字典赋值的引用机制与可变对象行为详解

本文深入解析 python 中字典等可变对象的赋值本质:`dict1 = dict2` 并非复制数据,而是共享同一内存对象;后续对字典内容的原地修改(如 `d[key] = val`)会影响所有引用者,而重新赋值(如 `d = {}`)则会切断引用关系。

在 Python 中,理解“赋值即绑定”(assignment is binding)是掌握对象行为的关键。变量名不是容器,而是指向对象的标签;而字典、列表等可变对象(mutable objects)一旦被多个变量引用,它们就共享同一块内存空间——这直接导致了你观察到的现象。

? 为什么第一个代码片段所有键都指向同一个字典?

set1 = {}  # ✅ 创建一个空字典对象,set1 指向它
set2 = {}

for i in s1:
    for j in range(1, len(i)):
        set1[i[j][0]] = i[j][1]  # ⚠️ 原地修改:向同一个字典插入/更新键值对
    set2[i[0]] = set1  # ✅ 将 set1 的引用(而非副本)存入 set2

这里 set1 始终指向同一个字典对象。每次循环中,你只是往这个同一个字典里不断添加或覆盖键值对;而 set2[i[0]] = set1 存储的始终是该字典的内存地址。最终 set2 的所有值都指向那个被反复修改的字典——因此所有键对应的值“看起来一样”,实则是同一对象的最终状态。

✅ 为什么第二个片段能正确工作?

set2 = {}
for i in s1:
    set1 = {}  # ✅ 关键!创建一个全新的字典对象,set1 现在指向新地址
    for j in range(1, len(i)):
        set1[i[j][0]] = i[j][1]  # ✅ 向这个新字典写入数据
    set2[i[0]] = set1  # ✅ 存储的是这个新字典的引用

set1 = {} 是一次重新绑定操作:它让变量 set1 脱离旧字典,转而指向一个全新、独立的空字典。因此每次循环生成的 set1 都是不同的对象,set2 中每个键都保存了各自独立字典的引用,结构自然符合预期:{name: {value: pair}, name2: {...}}。

? 类比澄清:引用 vs 重绑定

你提到的 dictionary1 = dictionary2 后再 dictionary2 = {...} 不影响 dictionary1,这完全正确——但它揭示的正是同一原理:

Midjourney
Midjourney

当前最火的AI绘图生成工具,可以根据文本提示生成华丽的视觉图片。

下载

立即学习Python免费学习笔记(深入)”;

dictionary2 = {1: 'a', 2: 'b'}
dictionary1 = dictionary2   # ✅ dictionary1 和 dictionary2 指向同一字典对象

dictionary2 = {1: 'f', 2: 'g'}  # ✅ 重新赋值:dictionary2 现在指向一个新字典
# dictionary1 仍指向原来的 {1:'a', 2:'b'} —— 引用未被破坏,只是变量绑定变了

⚠️ 注意区别

  • d[key] = value → 原地修改(in-place mutation),影响所有引用者;
  • d = {...} 或 d = [] → 重新绑定(rebinding),仅改变当前变量的指向,不影响其他变量。

? 实用建议与替代方案

  • 默认安全做法:在循环内每次都用 {} 或 dict() 创建新字典,避免意外共享。
  • 显式复制(如需复用旧结构)
    set1 = original_dict.copy()     # 浅拷贝(适用于键值均为不可变对象)
    # 或
    import copy
    set1 = copy.deepcopy(original_dict)  # 深拷贝(含嵌套可变对象时必需)
  • 使用字典推导式更 Pythonic
    set2 = {
        i[0]: {pair[0]: pair[1] for pair in i[1:]}
        for i in s1
    }

✅ 总结

Python 中没有“传值赋值”或“传引用赋值”的二分法——只有对象引用传递(pass by object reference)。可变对象的“共享性”源于多变量绑定到同一对象,而“隔离性”则依赖于显式创建新对象({})或深拷贝。理解 = 是绑定操作、d[k] = v 是方法调用(__setitem__),是写出可靠、可预测字典逻辑的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

108

2024.02.23

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

163

2025.06.26

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

24

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

4

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号