Python循环为字典赋值时所有值均为最后一项的问题求解
问题原因
所有键对应值都被最后一次循环结果覆盖的核心原因是:Python中字典属于可变引用类型
- 你在
for循环外部仅初始化了一次dict_shift = {},整个循环执行过程中始终在修改这同一个字典对象的内容 - 执行
output_table[val_number] = dict_shift时,存入的不是当前字典内容的快照,而是这个字典的内存引用 - 循环结束后
output_table的所有键都指向同一个dict_shift实例,存储的自然是最后一次循环写入的c_shift3、h_shift3值
注:你给出的预期输出示例最后一行遗漏了"val_number3":键,属于笔误。
修复方法
将dict_shift的初始化逻辑移到for循环内部,每次处理行数据时都创建一个全新的独立字典,再赋值给对应键即可。修复后的核心代码如下:
def fetch_value_in_table(input_table): # 不建议使用global传递结果,直接通过return返回值更规范,可避免全局变量意外污染 output_table = {} for line in input_table: val_number = line[0] c_shift = line[1] h_shift = line[2] # 每次循环新建独立的dict_shift实例,和其他循环的结果互不影响 dict_shift = {} dict_shift['c_shift'] = c_shift dict_shift['h_shift'] = h_shift output_table[val_number] = dict_shift return output_table
也可以用更简洁的字面量写法,省去单独初始化dict_shift变量的步骤:
def fetch_value_in_table(input_table): output_table = {} for line in input_table: val_number, c_shift, h_shift = line output_table[val_number] = { "c_shift": c_shift, "h_shift": h_shift } return output_table
执行后将得到预期结果:
{ "val_number1": {"c_shift": c_shift1, "h_shift": h_shift1}, "val_number2": {"c_shift": c_shift2, "h_shift": h_shift2}, "val_number3": {"c_shift": c_shift3, "h_shift": h_shift3} }
内容的提问来源于stack exchange,提问作者dpan
相关产品推荐
相关产品推荐

