追加python的奇怪行为?

时间:2011-10-25 21:55:34

标签: python append

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

所以这里是输入= 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 个答案:

答案 0 :(得分:2)

您不会在结果中附加五个不同的列表。您将五次附加相同的列表。

您可以通过将列表的副本附加到结果中来解决此问题:

ruudukko.append(rivi[:])

查看在线工作:ideone

答案 1 :(得分:2)

list.append()存储对附加对象的引用。因此,您已在列表rivi中的列表ruudukko中存储了多个引用。当然,因为它们实际上都是同一个对象,所以当你更改它时,它会在引用它的任何地方发生变化。

每次循环创建一个新的rivi列表。

这种行为并不奇怪;这是正常的和预期的,应该包含在任何体面的Python教程中。

答案 2 :(得分:0)

您将同一个对象放在列表ruudukko中五次。因此,ruudukko的5个项中的每一个实际上都绑定到同一个对象。

因为list是一个可变类型,所以您可以修改它,并且同样对该同一对象的每个其他引用也会被修改。当然,它只是一个被修改的对象,它只是向你看,好像ruudukko中的每个项都被修改了一样。事实并非如此,同样的物体出现了五次。

为了解决这个问题,每次追加ruudukko时都需要创建一个新的列表对象。有很多方法可以做到这一点,例如你可以这样做:

ruudukko.append(list(rivi))

我能想到的最简单的例子说明了可变对象的行为:

>>> a = [0]
>>> b = a
>>> b[0] = 1
>>> a
[1]

答案 3 :(得分:0)

您只声明了一次rivi,然后反复重新分配其值。您有这个可变的单个对象,会反复附加到您的外部列表ruudukko中。因为该对象是可变的而您没有复制它,所以最终会在ruudukko中的每个位置都得到最终值。