2014-07-10 55 views
1

我正在读取具有“missing”索引值(例如,1,2,4--缺少第三个索引)的CSV文件。我想用虚线填充空格,其索引和其他变量为零。这是,在坯料填充码(打印功能是用于检查):看起来像append()添加变量而不是它们的值

for i in range(int(row[0]) - id_last - 1): 
    dummy_row[0] = i 
    print dummy_row 
    csv_raw.append(dummy_row) 

打印输出显示的行如预期。但是在csv_raw中,第一列(索引)中的所有值都等于i的最后一个值,而不是我在调用append函数的那一刻的值。下面是输出:

打印dummy_row:

[3,0,0] [4,0,0] [6,0,0] [7,0,0] [8,0 ,0] [9,0,0]

打印csv_raw(在程序结束时):

[[1, '第一', '1'],[2,' ,[9,0,0],[9,0,0],[5','3', '3'],[9,0,0],[9,0,0] 0],[9,0,0],[9,0,0],[10,'4th','4']]

我试图声明,每个循环后,但它并没有改变结果。我想了解如何解决问题以及为何发生这种情况。我想这与python的工作方式有关(我知道一些基本的C,但没有正式的python培训)。

谢谢!

回答

1

问题是,当您使用csv_raw.append(dummy_row)时,您没有附加dummy_row的副本。这意味着每次添加对同一个对象的引用 - 每当dummy_row发生更改时,csv_raw中的相应条目也会发生更改,因为它们都是相同的。

你想要的是将dummy_row的副本附加到csv_raw。试试这个:csv_raw.append(list(dummy_row))

+0

哇!感谢您的超快速答案。它现在有效。 –

2

更改您的代码

csv_raw.append(dummy_row[:]) 

追加一个全切片(产生浅拷贝)的dummy_rowcsv_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 
+0

在这种情况下发生的事情很棒。 – TheSoundDefense

相关问题