Python二维列表赋值后二次打印全变为最后一行值,是什么原因?
问题根因
你代码里二维列表的初始化方式存在逻辑错误:lineData = [[0.0] * numPix] * numLines 这行代码并没有创建numLines个独立的子列表,只是把同一个子列表的引用复制了numLines次,整个lineData里的所有行都指向内存中完全相同的一个列表对象。
所以你每次修改lineData[r][p]的时候,本质上都是修改那个共享的子列表,所有行的对应位置会同步更新。
首次打印正常的原因
你首次打印是在每一个元素赋值完成后立刻输出的,此时共享子列表刚被修改为当前行的数值,所以打印出来的内容符合你当时的赋值预期。但当你处理下一行数据时,共享子列表又会被覆盖为新的行数值,之前行的内容也会同步被修改。
等所有行处理完毕后,共享子列表的内容已经被最后一行的数值覆盖,此时你第二次遍历打印所有行,自然所有行的内容都和最后一行完全一致。
正确的二维列表初始化方式
改用列表推导式生成独立的子列表即可:
lineData = [[0.0 for _ in range(numPix)] for _ in range(numLines)]
这种写法每次循环都会创建新的子列表,各个行之间完全独立,修改任意一行不会影响其他行的内容。
内容的提问来源于stack exchange,提问作者Tam
相关产品推荐
相关产品推荐

