为何使用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
相关产品推荐
相关产品推荐

