Python使用*初始化嵌套列表赋值后所有元素为最后一个值的问题
问题根源
你代码的问题出在初始化finalList的写法:finalList = [["none",0]]*len(list1)。
这种用乘法复制列表的操作,不会创建N个独立的子列表,只会把同一个子列表的内存引用复制N次存到外层列表里。也就是说你得到的finalList里,所有位置指向的都是同一个子列表对象,修改任意一个位置的子列表内容,其他所有位置都会同步变化。
你的循环每次执行finalList[i][0] = list1[i],本质都是在改这同一个公共子列表的首元素,最后一次循环赋值的内容是list1的最后一个元素30_39,所以最终所有子列表的首项全是这个值。
正确实现方案
最简洁的写法是直接用列表推导式,每次迭代生成独立的新子列表,从根源避免引用重复问题:
list1 = ['Low_Class', '40_49', '50_59', 'Marital_Status', '60_plus', '30_39'] finalList = [[item, 0] for item in list1]
运行后得到的结果就是你需要的:
[['Low_Class', 0], ['40_49', 0], ['50_59', 0], ['Marital_Status', 0], ['60_plus', 0], ['30_39', 0]]
如果你坚持要保留「先初始化固定长度列表、再循环赋值」的写法,初始化阶段也要用列表推导式生成独立子列表,不要用乘法复制可变对象:
# 错误写法(复用同一个子列表引用):finalList = [["none",0]]*len(list1) # 正确初始化(每个位置都是独立新子列表) finalList = [["none", 0] for _ in range(len(list1))] for i in range(len(list1)): finalList[i][0] = list1[i]
注意:用
*复制列表的写法仅适用于整数、浮点数、字符串、元组这类不可变对象;如果元素是列表、字典这类可变对象,用乘法复制一定会出现多个位置引用同一个对象的联动问题。
内容的提问来源于stack exchange,提问作者bilelbboy
相关产品推荐
相关产品推荐

