2014-07-10 3 views
1

Я читаю CSV-файл с «отсутствующими» значениями индекса (например, 1, 2, 4 - отсутствует 3-й индекс). Я хочу заполнить пробелы фиктивными линиями, которые имеют индекс и нули для других переменных. Это код, который заполняет пробелы (функция печати для проверки):похоже, что 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, а не 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, ' 2], [9, 0, 0], [9, 0, 0], [5, 3, '3'], [9, 0, 0], [9, 0, 0], [9, 0, 0], [9, 0, 0], [10, 4, 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_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 
+0

Отличная игра-игра от того, что происходит в таких случаях. – TheSoundDefense

Смежные вопросы