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

为何使用append而非加号时字典dic1的值会发生变化?

为什么Python中用append会修改字典里的值,而加号不会?

这个问题我刚学Python的时候踩过好几次坑,其实核心就是搞懂Python里可变对象的引用逻辑!先看一段能复现你遇到的现象的代码:

# 使用append的场景
my_dict = {'nums': [1, 2]}
target_list = my_dict['nums']
target_list.append(3)
print(my_dict)  # 输出: {'nums': [1, 2, 3]}

# 使用加号的场景
my_dict2 = {'nums': [1, 2]}
target_list2 = my_dict2['nums']
target_list2 = target_list2 + [3]
print(my_dict2)  # 输出: {'nums': [1, 2]}

是不是和你看到的结果完全一致?接下来咱们拆解背后的原因:

核心逻辑:可变对象的引用特性

在Python里,列表、字典这类属于可变对象——意思是它们的内容可以在原地修改,不需要生成新的对象。而字典中存储的并不是列表本身,而是这个列表在内存中的引用地址(你可以理解成指向这个列表的“指针”)。

  • 当你执行target_list = my_dict['nums']时,target_list并没有复制出一个新列表,而是拿到了和字典里完全相同的引用——就像你和你的朋友同时指着同一个储物箱。
  • 这时候调用target_list.append(3),是直接在这个储物箱里添加了新东西,字典里的引用依然指向这个储物箱,所以你查看字典时,自然能看到更新后的内容。

那为什么用加号+就不会改变字典呢?因为target_list2 + [3]这个操作会创建一个全新的列表对象(相当于新造了一个储物箱,把旧箱子里的东西和新东西都放进去),然后你把target_list2重新赋值为这个新列表的引用——也就是你转头去指新箱子了,但字典里的引用还是指着原来的旧箱子,所以字典里的内容不会有任何变化。

如何避免误改字典里的列表?

如果你想修改列表但不想影响字典中的原始数据,可以先创建列表的副本,比如:

my_dict = {'nums': [1, 2]}
# 方法1:用切片创建副本
target_list = my_dict['nums'][:]
target_list.append(3)
print(my_dict)  # 输出: {'nums': [1, 2]}

# 方法2:用list()函数创建副本
target_list2 = list(my_dict['nums'])
target_list2.append(4)
print(my_dict)  # 输出: {'nums': [1, 2]}

这样操作的就是副本,完全不会影响字典里的原始列表啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:28:56