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

Python循环中修改字典单个键值却导致所有键值同步变更如何解决?

问题根源

dict.fromkeys方法如果传入的默认值是可变对象(比如你代码里的列表[0]),字典所有键都会共享同一个可变对象的引用。也就是说你代码里dic['.']、dic[',']、dic['!']、dic['?']对应的列表是内存里的同一个列表,你修改任意一个的[0]位置,所有键的取值都会同步变化,最后一次赋值是标点!对应的计数4,所以所有值都变成了[4]。

修复方案

方法1:修改字典初始化逻辑,用字典推导式替代dict.fromkeys

把原来的初始化代码替换为字典推导式,每个键单独生成独立的[0]列表,互相不会干扰:

# 待统计的字符列表
charList = [".","!",".","!","!","!","p","p","p","p","p"]
# 需要统计的标点列表
punctuationList = [".",",","!","?"]

# 用字典推导式初始化,每个键对应独立的[0]列表
dic = {p: [0] for p in punctuationList}

print(dic)

# 统计每个标点的出现次数
for theKey in dic:
    counter = 0
    for theChar in charList:
        if theKey == theChar:
            counter = counter + 1
            dic[theKey][0] = counter

print(dic)

运行后即可得到预期输出{'.': [2], ',': [0], '!': [4], '?': [0]}。

方法2:简化统计逻辑(可选优化)

可以直接调用列表的count方法省去嵌套循环,代码更简洁:

charList = [".","!",".","!","!","!","p","p","p","p","p"]
punctuationList = [".",",","!","?"]
# 一步生成目标字典
dic = {p: [charList.count(p)] for p in punctuationList}
print(dic)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:03