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

