Python 调用时函数的重复

Python 调用时函数的重复,python,function,Python,Function,下面是我的代码 n = 4 m = 4 figures = [1,2,2] def almostTetris(n, m, figures): grid = [[0] * m] * n def shape1(count): for i in range(n): for j in range(m): if grid[i][j] == 0: print(grid[i][j

下面是我的代码

n = 4
m = 4
figures = [1,2,2]

def almostTetris(n, m, figures):
    grid = [[0] * m] * n

    def shape1(count):
        for i in range(n):
            for j in range(m):
                if grid[i][j] == 0:
                    print(grid[i][j])
                    print(grid[1][0])
                    print(grid[2][0])
                    print(grid[3][0])
                    grid[i][j] = count
                    print(grid[i][j])
                    print(grid[1][0])
                    print(grid[2][0])
                    print(grid[3][0])
                    return

    def shape2(count):
        for i in range(n):
            for j in range(m - 2):
                if grid[i][j] == 0 and grid[i][j + 1] == 0 and grid[i][j + 2] == 0:
                    grid[i][j] = grid[i][j + 1] = grid[i][j + 2] = count
                    return

    for i in range(len(figures)):
        if figures[i] == 1:
            shape1(i + 1)
        elif figures[i] == 2:
            shape2(i + 1)
    
    return grid

print(almostTetris(n, m, figures))
这是我打印出来的:

0
0
0
0
1.
1.
1.
1.
[[1, 2, 2, 2], [1, 2, 2, 2], [1, 2, 2, 2], [1, 2, 2, 2]]
我的问题是
grid[i][j]=count如何将第一列中的所有数字转换为1(count的值)?

我想因为
I
j
都是0,所以只有第一个元素会变为1。

当我第一次学习python时,我也很难做到这一点。问题就在这方面

grid=[[0]*m]*n
因为它不会创建0的nxm网格, 它实际上复制对象:
[[0]*m]
n次以创建2d数组。因此,如果您更改此对象中的一个值,则其他n个对象实例也会被编辑。试着做一些类似的事情

grid=[[0]*m表示范围内(n)]

问题就在这里:
grid=[[0]*m]*n
,因为它创建了对同一列表的一组引用,而不是您所期望的新列表。使用列表理解代替。哇,非常感谢。。。我只是无法理解这个。。。