Python字典赋值异常:所有键对应列表完全相同的问题排查
问题分析与解决:Python字典赋值后所有键对应列表一致的问题
你的代码核心问题是Python中列表是可变对象,赋值传递的是引用而非副本。
你在循环里反复把numbers赋值给字典的不同键,但实际上所有键存储的都是同一个列表的内存地址。后续每次numbers.append()修改的都是这个唯一的列表,所以最后所有键都会指向这个被修改到最终状态的列表。
解决方法
方法1:每次赋值时创建列表副本
在把列表存入字典时,用copy()方法或者list()生成当前列表的副本,这样每个键都会持有独立的列表:
months = ['jan', 'feb', 'mar', 'apr'] numbers = [] sqrDict = {} i = 1 for m in months: numbers.append(i**2) sqrDict[m] = numbers.copy() # 生成当前列表的副本 i += 1 print('sqrDict =', sqrDict)
方法2:用列表推导式直接生成对应列表
更简洁的方式是利用enumerate获取索引,直接生成对应长度的平方列表,避免共享引用的问题:
months = ['jan', 'feb', 'mar', 'apr'] sqrDict = {} for idx, m in enumerate(months, start=1): sqrDict[m] = [x**2 for x in range(1, idx+1)] print('sqrDict =', sqrDict)
方法3:通过列表拼接创建新列表
利用列表+拼接会返回新列表的特性,每次生成新的列表存入字典:
months = ['jan', 'feb', 'mar', 'apr'] current_squares = [] sqrDict = {} i = 1 for m in months: current_squares = current_squares + [i**2] # 拼接生成新列表 sqrDict[m] = current_squares i += 1 print('sqrDict =', sqrDict)
以上三种方法都能让字典的每个键对应独立的列表,得到你预期的结果。
内容的提问来源于stack exchange,提问作者AliReza
相关产品推荐
相关产品推荐

