0

亲爱的,我是编程新手,我正在使用 Python。

我有以下代码:

P=[]
i=0
j=0

P=[[0]*5]*5
while i<5:
    for j in range(0,5):
        P[i][j]=i-j
    i=i+1
print(P)

我希望得到以下输出:

[[0, -1, -2,-3, -4], [1, 0, -1, -2, -3], [2, 1, 0, -1, -2], [3, 2 , 1, 0, -1], [4, 3, 2, 1, 0]]

因为我想在单元格中保留它们的行号和列之间的差异。

该程序给出以下输出:

[[4, 3, 2, 1, 0], [4, 3, 2, 1, 0], [4, 3, 2, 1, 0], [4, 3, 2, 1, 0], [ 4、3、2、1、0]]

在此先感谢您的帮助!

4

1 回答 1

3

[[0]*5]*5创建列表的 5 个副本[0, 0, 0, 0, 0]。这可以通过使用map和看出id

>>> list(map(id, [[0]*5]*5))
[58739912, 58739912, 58739912, 58739912, 58739912]

请注意,每个值都是相同的。这意味着每次更改这些列表中的任何一个时,都会更改所有列表。

对此的简单解决方案是使用列表推导。

P = [[0]*5 for i in range(5)]

请注意,这个问题只发生在像列表这样的可变对象上,所以它适用于整数。


作为旁注,可以以更简单的方式解决问题。

>>> P = [[i for i in range(j, j-5, -1)] for j in range(5)]
>>> P
[[0, -1, -2, -3, -4], [1, 0, -1, -2, -3], [2, 1, 0, -1, -2], [3, 2, 1, 0, -1], [4, 3, 2, 1, 0]]
于 2013-03-16T01:05:10.537 回答