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

为什么python在这里使用嵌套循环时打印奇怪的结果?,python,arrays,loops,nested-loops,Python,Arrays,Loops,Nested Loops,我得到了一个字符串数组,我想将每个字符串拆分为单独的字符,并将它们存储在单独的二维数组中。我编写了以下代码:- # 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[

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

# 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(网格)]*len(网格)
此语句正在创建一个关系2D数组(矩阵),因此每当您更新一行时,它都会更新所有其他行

您应该使用此选项创建空的二维阵列:

mat=[[len(网格)中的i无][len(网格)中的j无]]
正如@marc所评论的,你也可以在这里传递一个列表,宽度=高度

mat=[[None]*len(网格)表示范围内的(len(网格))]

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

#给定的数组
网格=['1112','1912','1892','1234']
#创建新的二维阵列
#mat=[[None]*len(网格)]*len(网格)
mat=[]
对于范围内的i(len(网格)):
t=[]
对于范围内的j(透镜(网格)):
t、 追加(无)
材料附加(t)
对于范围(0,len(网格))中的i:
对于范围(0,len(网格))内的j:
mat[i][j]=网格[i][j]
印刷品(垫子)

我不得不承认,在这个问题上很容易混淆这一点

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

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

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

>>mat=[[None]*2]*2
>>>id(mat[0])
76447616
>>>id(材料[1])
76447616
>>>网格=[0,0]
>>>x=[[None]*len(网格)表示范围内的(len(网格))]
>>>id(x[0])
76457744
>>>id(x[1])
76391968

这会起作用,但处理时间比我的答案要长,列表理解也更容易阅读。您可以安全地跳过列表理解步骤之一,使用
mat=[[None]*len(网格)表示范围内的i(len(网格)]
@Marc啊是的,我会把它加在旁边,如果他们以后需要一个宽度与高度不同的矩阵,他们仍然需要做两个列表理解