Странное поведение апдейта питона? - PullRequest
0 голосов
/ 26 октября 2011
size = input('Kirjainmäärä: ')
kirjaimet = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"

ruudukko = []
rivi = ['0']*(size*2-1)

for i in range(0,size): #produce n rows
    for y in range(0,i+1): #this row needs i+1 letters
        for z in range(0+i,size*2-1-i):
            rivi[z] = kirjaimet[size-i]
    print rivi, i
    ruudukko.append(rivi)
print ruudukko

Таким образом, код должен был производить числовые матрицы в формате

input=4

output=

DDDDDDD
DCCCCCD
DCBBBCD
DCBABCD

так вот вывод вышеприведенного кода с input = 5 (print rivi, i -part)

['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'] 0
['E', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'E'] 1
['E', 'D', 'C', 'C', 'C', 'C', 'C', 'D', 'E'] 2
['E', 'D', 'C', 'B', 'B', 'B', 'C', 'D', 'E'] 3
['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'] 4

пока все хорошо, но потом ..

[['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E']]

Добавлен список ruudukko, заполненный объектом, добавленным последним!

Что, черт возьми, происходит?

Ответы [ 4 ]

2 голосов
/ 26 октября 2011

list.append() хранит ссылку на добавленный объект. Таким образом, вы сохранили несколько ссылок на ваш список rivi в вашем списке ruudukko. Естественно, поскольку все они на самом деле являются одним и тем же объектом, когда вы меняете его, он изменяется везде, где на него ссылаются.

Создайте новый список rivi каждый раз в цикле.

Это поведение не странно; это нормально и ожидаемо и должно быть описано в любом приличном учебнике по Python.

2 голосов
/ 26 октября 2011

Вы не добавляете пять разных списков к вашему результату. Вы добавляете список один и тот же пять раз.

Вы можете исправить это, добавив копию вашего списка к результату:

ruudukko.append(rivi[:])

Посмотрите, как он работает онлайн: ideone

0 голосов
/ 26 октября 2011

Вы объявили rivi только один раз, а затем неоднократно переназначали его значение. У вас есть этот единственный объект, который является изменяемым, неоднократно добавляется в ваш внешний список ruudukko. Поскольку объект является изменяемым, а вы его не копируете, в конечном итоге в каждой позиции в ruudukko.

вы получите окончательное значение.
0 голосов
/ 26 октября 2011

Вы помещаете один и тот же объект в список ruudukko пять раз. Таким образом, каждый из 5 элементов ruudukko фактически связан с одним и тем же объектом.

Поскольку list является изменяемым типом, вы можете изменить его, и каждая другая ссылка на этот же объект также будет изменена. Конечно, изменяется только один объект, он выглядит так, как будто каждый элемент в ruudukko был изменен. Дело не в этом, один и тот же объект появляется там пять раз.

Чтобы это исправить, вам нужно создавать новый объект списка каждый раз, когда вы добавляете к ruudukko. Есть много способов сделать это, например, вы можете сделать это так:

ruudukko.append(list(rivi))

Самый простой пример, который я могу представить, который иллюстрирует поведение изменяемых объектов, таков:

>>> a = [0]
>>> b = a
>>> b[0] = 1
>>> a
[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...