You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字典为何和列表有相同的引用指向行为?背后逻辑是什么

Python赋值操作的底层特性说明

你观察到的列表、字典、元组的「指向」行为,本质来源于Python的对象引用模型核心设计:

  • Python中所有变量都只是绑定到内存对象上的标签,并不是存储数据的独立容器,赋值操作a = b的本质是给b指向的内存对象新增一个名为a的标签,不会生成新的对象副本
  • 你用id()函数查到d1和d2id一致,就是因为两个变量绑定的是同一个内存地址上的字典对象
  • 对列表、字典这类可变对象做内容修改时,改动的是内存中对象本身的内容,所以所有绑定到该对象的变量读取到的结果都会同步变化
  • 执行del d1只会删除d1这个绑定标签,只要还有其他变量(比如d2)绑定到原字典对象,对象就不会被垃圾回收销毁,因此你还能通过d2读取到修改后的内容
  • 元组属于不可变类型,本身不支持修改内部存储的元素,所以不会出现修改后所有引用同步变化的显性表现,但赋值操作依然是绑定到同一个对象,你可以通过id()验证元组赋值后两个变量的id完全一致

该特性的官方说明可以查阅Python标准文档的「数据模型」章节,文档明确说明:Python的赋值操作永远传递的是对象的引用,而非对象本身的拷贝,该规则对所有类型的对象统一适用。

如果你需要生成独立的可变对象副本,可以根据使用场景选择两种拷贝方案:

  • 浅拷贝:调用list.copy()、dict.copy()方法,或者对列表用切片语法l2 = l1[:],仅生成新的外层容器对象,容器内部存储的元素依然是原对象的引用,适合容器内都是不可变元素的场景
  • 深拷贝:导入copy模块后调用copy.deepcopy(原对象),会递归拷贝所有层级的嵌套对象,生成完全独立的新副本,适合存在多层嵌套可变元素的场景

内容的提问来源于stack exchange,提问作者BertHobe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:36:02