Python的append方法出现奇怪行为?

0 投票
4 回答
751 浏览
提问于 2025-04-17 05:00
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

你并不是把五个不同的列表添加到结果中,而是把同一个列表添加了五次。

你可以通过添加列表的副本来解决这个问题:

ruudukko.append(rivi[:])

在线查看效果:ideone

撰写回答