为什么python在这里使用嵌套循环时会打印奇怪的结果



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

# 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。2D数组mat的每一行都被打印为['1','2','3','4'],但这应该只是最后一行的值。

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

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

这句话是在创建一个关系型2D数组(矩阵(,所以无论何时更新一行,它都会更新所有其他行。

您应该使用它来创建一个空的2D阵列:

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

正如@mrc所评论的,你也可以通过一个列表理解,这里的宽度=高度

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

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

# 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]的同一poobject,因为*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

最新更新