Python字典值为列表时单键赋值同步修改所有列表问题排查
问题原因
这个现象和你写的赋值逻辑无关,player.groupno是被正常读取的,问题出在session.feedback的初始化环节:
Python中列表是可变引用类型,你初始化字典时,所有整数key对应的value都指向了内存里的同一个列表对象,并没有生成10个独立的空列表。这种情况下,无论你通过哪个key取到这个列表、修改它的某个索引位置的内容,本质都是修改那唯一的一个列表对象,最终所有key查到的都是修改后的同一个列表,就出现了所有组都被写入相同字符串的现象。
最容易触发这个问题的两种错误初始化写法如下:
# 错误写法1:提前创建好列表,所有key复用同一个列表对象 init_list = [''] * 9 session.feedback = {} for group_id in range(1, 11): session.feedback[group_id] = init_list
# 错误写法2:用dict.fromkeys传入列表作为默认值,所有key会共用这个默认值 session.feedback = dict.fromkeys(range(1, 11), [''] * 9)
修复方法
调整字典初始化逻辑,保证每个key对应的列表都是独立创建的新对象,不同key的value互不引用即可。你原本的赋值代码不需要修改,初始化改对后就能正常只写入对应组的位置。
两种正确的初始化写法:
- 字典推导式写法(最简洁)
# 每次循环都会生成一个全新的9空字符串列表,各key的value完全独立 session.feedback = {group_id: [''] * 9 for group_id in range(1, 11)}
- 循环内新建列表写法
session.feedback = {} for group_id in range(1, 11): # 每次循环都新建独立列表,不复用外部已创建的列表对象 session.feedback[group_id] = [''] * 9
初始化完成后可以做个简单校验:执行print(id(session.feedback[1]), id(session.feedback[2])),如果两个内存地址不同,就说明列表是独立的,不会再出现同步修改的问题。
内容的提问来源于stack exchange,提问作者buettner
相关产品推荐
相关产品推荐

