我有一个10 * 22矩阵,我将其存储为二维点列表。
初始矩阵(左)必须转换为右边的矩阵,逻辑是如果一行没有点,则必须将其转换为所有点的一个。
但由于某种原因,当我调用函数步骤时,我的矩阵不会更新。但是当我打印 矩阵 时,它会让我恢复原来未改动的。
以下是我的代码:
WIDTH, HEIGHT =10, 22
matrix=[['.' for x in range(WIDTH)] for y in range(HEIGHT)]
'''
somewhere in between I am changing the matrix, and the result gets
successfully stored in 'matrix'
'''
def step():
global matrix
for row in matrix:
if row.count('.')==0:
row = ['.' for elem in row]
答案 0 :(得分:1)
问题不是全局变量,而是在循环中重新分配row
名称:
row = ['.' for elem in row]
创建row
的新引用,matrix
未知。
你可以改善&例如,通过使用切片分配进行修复更高效的代码:
for row in matrix:
if not '.' in row: # no need to count, just check if a dot is there
row[:] = ['.'] * len(row)
这有效但创造了&复制了大量数据。列表理解而不是循环可能会更好:
matrix = [row if '.' in row else ['.'] * len(row) for row in matrix]
(它起作用,因为matrix
是全局的)。此外,matrix
init可以简化为:
matrix=[['.']*WIDTH for _ in range(HEIGHT)]
由于字符串是不可变的,你可以使用乘法来创建行(但不能用于外部循环!)