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
相关产品推荐
相关产品推荐

