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全部填满了最后附加的对象!
到底发生了什么事?
答案 0 :(得分:2)
答案 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
中的每个位置都得到最终值。