Почему добавление перезаписывает все в списке новым элементом?

Я пишу скрипт Python, который читает CSV-файл и создает список очередей. Если я распечатаю именно то, что добавляется в список до его добавления, это выглядит так, как я хочу, но когда я распечатываю сам список, я вижу, что добавление перезаписывает все элементы в списке самым новым.

    # Window is a list containing many instances            
def slideWindow(window, nextInstance, num_attributes):
    attribute = nextInstance.pop(0)
    window.popleft()
    for i in range(num_attributes):
        window.pop()
    window.extendleft(reversed(nextInstance))
    window.appendleft(attribute)
    return window

def convertDataFormat(filename, window_size):
    with open(filename, 'rU') as f:
        reader = csv.reader(f)

        window = deque()
        alldata = deque()

        i = 0
        for row in reader:
            if i < (window_size-1):
                window.extendleft(reversed(row[1:]))
                i+=1
            else:
                window.extendleft(reversed(row))
                break

        alldata.append(window)

        for row in reader:
            window = slideWindow(window, row, NUM_ATTRIBUTES)
            alldata.append(window)
#             print alldata

        f.close()
        return alldata

person AJ Jenkins    schedule 10.08.2012    source источник
comment
Примечание: когда вы используете with open(...), вам не нужно закрывать файл. На самом деле, это одно из преимуществ менеджеров контекста.   -  person    schedule 10.08.2012


Ответы (2)


Очень сложно отследить, что именно вы хотите от этого кода. Подозреваю, что проблема заключается в следующем:

alldata.append(window)

for row in reader:
    window = slideWindow(window, row, NUM_ATTRIBUTES)
    alldata.append(window)

Обратите внимание, что в вашей функции slideWindow вы изменяете очередь ввода (window), а затем возвращаете измененный deque. Итак, вы помещаете deque в первый элемент вашего списка, затем вы изменяете этот объект (внутри slideWindow) и добавляете еще одну ссылку на тот же объект в свой список.

Это то, что вы собираетесь делать?

Простое исправление состоит в том, чтобы скопировать ввод window в slideWindow и изменить/вернуть копию.

person mgilson    schedule 10.08.2012
comment
Извините, мой код такой запутанный. Я не знал, что Python передает все по ссылке, поэтому мне пришлось сделать копию окна, а затем добавить ее в alldata. Спасибо за вашу помощь! - person AJ Jenkins; 10.08.2012

Я точно не знаю, но подозреваю, что это может быть похоже на эту проблему http://forums.devshed.com/python-programming-11/appending-object-to-list-overwrites-previous-842713.html.

person surfreak    schedule 10.08.2012