为什么 python 在此处使用嵌套循环时打印出奇怪的结果?

Why is python printing weird results while using the nested loop here?

我得到了一个字符串数组,我想将每个单独的字符串拆分成单独的字符并将它们存储在一个单独的二维数组中。我写了下面的代码:-

# The given array
grid = ['1112', '1912', '1892', '1234']

# Creating a new 2D array
mat = [[None]*len(grid)]*len(grid)
for i in range(0,len(grid)):
    for j in range(0,len(grid)):
        mat[i][j] = grid[i][j]
print(mat)

但是这样做会在我的二维数组 mat 中产生奇怪的值。二维数组 mat 的每一行都打印为 ['1','2','3','4'] 但这应该只是最后一行的值.

如果有人能回答我的问题,我将不胜感激。

mat = [[None]*len(grid)]*len(grid)

此语句正在创建关系二维数组(矩阵),因此无论何时更新一行,它都会更新所有其他行。

您应该使用它来创建一个空的二维数组:

mat = [[None for i in len(grid)] for j in range(len(grid))]

正如@marc 评论的那样,您还可以在此处传递一个列表推导式作为 width = height

mat = [[None]*len(grid) for _ in range(len(grid))]

对list的乘法在内存中进行相同的引用,代码固定如下:

# The given array
grid = ['1112', '1912', '1892', '1234']

# Creating a new 2D array
# mat = [[None]*len(grid)]*len(grid)
mat = []
for i in range(len(grid)):
    t = []
    for j in range(len(grid)):
        t.append(None)
    mat.append(t)

for i in range(0,len(grid)):
    for j in range(0,len(grid)):
        mat[i][j] = grid[i][j]
print(mat)

我不得不承认这个问题很容易混淆。

假设 len(grid) = 2,所以我们得到 mat = [[None]*2]*2

这里 mat[0] 指向与 mat[1] 相同的 pobject,因为 *2 给出了两个指向同一个数组的指针。您可以使用 for _ in range(2) 来创建两个不同的对象 - [[None]*len(grid) for _ in range(len(grid))]

我们可以使用id打印对象的地址来验证:

>>> mat = [[None]*2]*2
>>> id(mat[0])
76447616
>>> id(mat[1])
76447616
>>> grid = [0, 0]
>>> x = [[None]*len(grid) for _ in range(len(grid))]
>>> id(x[0])
76457744
>>> id(x[1])
76391968