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

Python字典疑问:修改嵌套字典影响原字典,普通键值为何不影响?

为什么这两个Python字典操作案例的结果截然不同?

这其实是Python里可变对象的引用机制和浅拷贝行为导致的差异,咱们一步步拆解清楚:

先看案例2(非嵌套字典)

先把代码整理清晰:

content = {'a': 1, 'b': 2}
d1 = {'k1': {}}
d1['k1'].update(content)
print(d1)  # 输出: {'k1': {'a': 1, 'b': 2}}
content['a'] = 3
content['b'] = 4
print(d1)  # 输出: {'k1': {'a': 1, 'b': 2}}

这里content里的'a'和'b'对应的值是不可变类型(int)。当你调用d1['k1'].update(content)时,Python会把content里的键值对完整复制到d1['k1']这个空字典里——注意,是把1和2这些值的副本存进去,而不是存指向content里值的引用。

所以后续修改content['a'] = 3,只是改变了content字典里'a'对应的引用,和d1['k1']里已经存好的1没有任何关系,自然d1不会跟着变。

再看案例1(嵌套字典)

同样先整理代码:

content = {'a': {'v': 1}, 'b': {'v': 2}}
d1 = {'k1': {}}
d1['k1'].update(content)
print(d1)  # 输出: {'k1': {'a': {'v': 1}, 'b': {'v': 2}}}
content['a']['v'] = 3
content['b']['v'] = 4
print(d1)  # 输出: {'k1': {'a': {'v': 3}, 'b': {'v': 4}}}

这里content里的'a'和'b'对应的值是可变类型(字典)。当你调用update方法时,Python确实把'a'和'b'这两个键复制到了d1['k1']里,但对应的值——也就是那两个子字典{'v':1}和{'v':2}——并没有被复制,而是把指向这些子字典的引用存到了d1['k1']中。

换句话说,content['a']和d1['k1']['a']指向的是同一个内存地址里的字典对象。所以当你修改content['a']['v'] = 3时,其实是直接修改了那个共享的字典对象,d1里的引用自然也会看到这个变化。

怎么避免案例1里的意外修改?

如果想让d1里的内容不受后续content修改的影响,需要做深拷贝,也就是把嵌套的可变对象也一起完整复制一份:

import copy

content = {'a': {'v': 1}, 'b': {'v': 2}}
d1 = {'k1': {}}
# 使用深拷贝代替直接update
d1['k1'] = copy.deepcopy(content)
content['a']['v'] = 3
print(d1)  # 输出: {'k1': {'a': {'v': 1}, 'b': {'v': 2}}},完全不受影响

核心总结

  • 不可变类型(int、str、tuple等)赋值/复制时,会创建新的独立副本
  • 可变类型(dict、list等)赋值/浅拷贝时,只会复制引用,多个变量会指向同一个对象
  • dict.update()对于可变值来说是浅拷贝行为,只会复制引用而非对象本身

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:21:14