我在做Project Euler Problem 15。我使用了正确的算法,但是它似乎没有用。这是我的代码:

f = [[0] * 21] * 21

# init the list
for i in range(21):
    f[0][i] = 1
    f[i][0] = 1

for i in range(21):
    for j in range(21):
        f[i][j] = f[i-1][j] + f[i][j-1]

print f[20][20]


完成列表初始化后,我将其打印出来。我期望它像[[1, 1, 1...], [1, 0, 0...]...],但是它变成了[[1, 1, 1...], [1, 1, 1...]...],我不知道为什么。

我曾经使用过类似C的语言,并且我认为Python中的列表有点像C中的数组,因此我以相同的方式使用它们。

最佳答案

乘以列表时,您不是在创建单独的列表,而是创建对同一列表的多个引用。

相反,请执行以下操作:

f = [[0 for _ in range(21)] for _ in range(21)]


使用id()函数时,您可以看到不同之处:

>>> f = [[0]*21]*21
>>> for nested in f[:3]:
...     print id(nested)
...
4523317152
4523317152
4523317152
>>> f = [[0 for _ in range(21)] for _ in range(21)]
>>> for nested in f[:3]:
...     print id(nested)
...
4523317512
4523317440
4523317656


单独的对象具有单独的内存ID值,而每个id()调用的列表结果相同,表明它们都是相同的列表。

关于python - 二维列表如何在Python中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13788380/

10-14 19:03
查看更多