我在做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/