似乎append()添加变量而不是它们的值

时间:2014-07-10 17:55:39

标签: python python-2.7 append

我正在阅读一个缺少"缺少"的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的正式培训)。

谢谢!

2 个答案:

答案 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))