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
相关产品推荐
相关产品推荐

