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

为何修改Python字典中一个列表元素会影响所有列表?

为什么dict.fromkeys创建的字典修改一个值会同步所有键的对应值?

核心原因:dict.fromkeys的参数求值机制

dict.fromkeys(keys, value)的工作逻辑是:第二个参数value只会被计算一次,生成的单个对象会被绑定到字典的所有键上。哪怕你用copy.deepcopy(l),也只是在调用fromkeys时复制了一次列表,得到一个唯一的列表对象,字典里所有键指向的都是这同一个对象。所以当你修改这个列表的元素时,所有键对应的都是同一个列表,自然全部同步变化。

字典推导式为什么正常?

{key:[0,0] for key in keys}的循环逻辑是:每遍历一个键,就执行一次[0,0]来创建新的列表。每个键对应的都是独立的列表对象,彼此完全不关联,修改其中一个只会影响自身。

验证对象唯一性

可以通过打印对象ID直观看到差异:

import copy
keys = [i for i in range(5)]
l = [0,0]

d_fromkeys = dict.fromkeys(keys, copy.deepcopy(l))
print("fromkeys创建的字典值的ID:")
for v in d_fromkeys.values():
    print(id(v))  # 所有ID完全相同

d_comprehension = {key:[0,0] for key in keys}
print("\n字典推导式创建的字典值的ID:")
for v in d_comprehension.values():
    print(id(v))  # 每个ID都不一样

解决方案

除了字典推导式,也可以通过手动循环赋值实现,确保每个键对应独立对象:

d = {}
for key in keys:
    d[key] = [0,0]  # 每次循环新建列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:46