我正在阅读一个缺少"缺少"的CSV文件索引值(例如,1,2,4 - 缺少第3个索引)。我想用虚拟行填充空白,这些虚拟行具有其他变量的索引和零。这是填充空白的代码(打印功能用于检查):
for i in range(int(row[0]) - id_last - 1):
dummy_row[0] = i
print dummy_row
csv_raw.append(dummy_row)
打印输出按预期显示行。但是在csv_raw中,第1列(索引)中的所有值都等于i的最后一个值,而不是我调用append函数时的i。这是输出:
print dummy_row:
[3,0,0] [4,0,0] [6,0,0] [7,0,0] [8,0,0] [9,0,0]
print csv_raw(在程序结束时):
[[1,' 1st',' 1'],[2,' 2nd',' 2'],[9 ,0,0],[9,0,0],[5,'第3', ' 3'],[9,0,0],[9,0,0],[9,0,0],[9,0,0],[10,'第4& #39;,' 4']]
我试图声明每次循环后都会上升,但它没有改变结果。我想了解如何解决问题及其发生的原因。我猜这与python的工作方式有关(我知道一些基本的C,但没有python的正式培训)。
谢谢!
答案 0 :(得分:2)
将您的代码更改为
csv_raw.append(dummy_row[:])
将dummy_row
的完整切片(生成浅副本)附加到csv_raw
。目前,您只是将相同列表的引用添加到列表csv_raw
中。
演示正在发生的事情:
>>> master = []
>>> a = [1,2,3]
>>> master.append(a)
>>> master.append(a)
>>> master
[[1, 2, 3], [1, 2, 3]]
>>> a[1] = 42
>>> master
[[1, 42, 3], [1, 42, 3]]
master
包含对a
的两个引用,因此在更改a
后,显示master
的输出也会发生变化。
>>> master.append(a[:]) # append a COPY of a
>>> master
[[1, 42, 3], [1, 42, 3], [1, 42, 3]]
>>> a[1] = 100
>>> master
[[1, 100, 3], [1, 100, 3], [1, 42, 3]]
现在,master[0]
和master[1]
包含相同对象的引用,该对象与master[2]
不同。
>>> id(master[0])
41583032
>>> id(master[1])
41583032
>>> id(master[2])
41713816
答案 1 :(得分:1)
问题在于,当您使用csv_raw.append(dummy_row)
时,您不会附加dummy_row
的副本。这意味着您每次都会添加对完全相同的对象的引用 - 每当dummy_row
更改时,csv_raw
中的相应条目也会发生变化,因为它们都是相同的。
您想要的是将dummy_row
的副本附加到csv_raw
。试试这个:csv_raw.append(list(dummy_row))
。