This question already has answers here:
List of lists changes reflected across sublists unexpectedly
                                
                                    (13个回答)
                                
                        
                                2年前关闭。
            
                    
s = [[0]*3]*3

i = 0
while i < 3:
    j = 0
    while j < 3:
        print(s[i][j])
        s[i][j] += 1
        j += 1
    i += 1


上面代码的打印结果确实让我感到困惑,为什么数组的第二和第三列变成[1,1,1][2,2,2]而不是[0,0,0]

最佳答案

因为当您使用[[0]*3]*3创建列表列表时,您要创建3次[0,0,0]列表,所以您会有[[0,0,0],[0,0,0],[0,0,0]],但是所有子列表([0,0,0])的引用都相同列表,因为您刚刚创建了一个列表并将其乘以3以创建其他列表,所以更改一个列表将更改另一个列表。
为避免这种情况,请使用列表理解功能创建独立的零位列表:

s = [[0]*3 for i in range(3)]

i = 0
while i < 3:
    j = 0
    while j < 3:
        print(s[i][j])
        s[i][j] += 1
        j += 1
    i += 1
print(s) # just to see the final result


哪个输出:

0
0
0
0
0
0
0
0
0
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]

关于python - 关于数组嵌套循环的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46131031/

10-15 08:53