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

Python使用dict.fromkeys生成空列表值字典结果不符合预期问题求助

问题原因

你遇到的问题核心是dict.fromkeys()方法的特性:当传入的初始值是可变对象时,字典中所有键会共享同一个对象的引用,并不会为每个键单独创建新的对象。

  • 初始化upper_to_count时使用的初始值是0,属于不可变的数值类型。每次执行+=1操作时,都会生成新的数值替换对应键的值,不同键的修改不会互相干扰,因此结果符合预期。
  • 初始化upper_to_lower时使用的初始值是[]空列表,属于可变对象。字典中所有的键(A、B、C)都指向同一个列表实例,你往任意一个键对应的列表追加元素,本质都是修改同一个公共列表,因此最后所有键的列表内容完全一致,就是整个循环过程中追加的所有元素。
修复方案
  1. 把upper_to_lower的初始化逻辑从dict.fromkeys()改成字典推导式,为每个键单独生成新的空列表:
# 字典推导式会为每个key单独创建新的空列表,互不影响
upper_to_lower = {key: [] for key in upper_list}
# 也可以先对upper_list去重,减少重复操作:{key: [] for key in set(upper_list)}
  1. (可选优化)循环逻辑可以直接遍历字典的键值对,不需要手动通过索引取键,写法更简洁也避免潜在的顺序问题:
for lower, uppers in lower_to_upper.items():
    for upper in uppers:
        upper_to_count[upper] += 1
        upper_to_lower[upper].append(lower)
需要补充的相关知识点
  • Python数据类型分为可变(列表、字典、集合)和不可变(数值、字符串、元组)两类,可变对象传递的是内存引用,修改操作会作用于原对象;不可变对象传递的是值拷贝,修改操作会生成新对象。
  • dict.fromkeys()只适合用不可变对象作为初始化值,需要用可变对象初始化字典时,必须使用字典推导式单独生成每个键的值。
  • 遍历字典时优先使用dict.items()同时获取键和值,尽量不要通过枚举索引的方式取键,避免低版本Python字典无序导致的匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:00