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时(打印rivi和i的部分)
['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
你只声明了一次 rivi
,然后不断地给它重新赋值。你只有这个单一的对象,它是可以改变的,然后把它反复添加到外面的列表 ruudukko
中。因为这个对象是可以改变的,而且你没有复制它,所以最后在 ruudukko
的每个位置上都得到了相同的最终值。
2
list.append()
方法会把你添加的对象的引用存储起来。这意味着你在列表 ruudukko
中存储了多个对列表 rivi
的引用。因为它们实际上都是同一个对象,所以当你修改其中一个时,所有地方的引用都会跟着改变。
每次循环的时候,记得新建一个 rivi
列表。
这种行为并不奇怪;这是正常的现象,任何好的 Python 教程都会讲到这一点。
2