我想创建一个具有可变行数和列数的网格。我所做的就是这个
BaseRow = []
for j in range (0, columns):
BaseRow.append(0)
Grid = []
for j in range (0, rows):
Grid.append(BaseRow)
所以直到现在一切似乎都很好,我用这段代码按顺序打印行
for i in range (1, rows+1):
print Grid[rows-i]
和一个类似的网格
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
已打印。问题是,之后,我想更改一个特定的元素。但当我这样做的时候,
Grid[0][0] = 1
然后再次打印,而不是只将最右边的0更改为1,整个列都会更改,因此它变成
[1, 0, 0]
[1, 0, 0]
[1, 0, 0]
我怀疑它看到了Grid从BaseRow中获取,所以它更改了BaseRow,然后Grid从BaseRow中获取行,并将该值放在各处。我怀疑.append可能不是我想要的,但对于我所做的所有研究,我都没有找到其他可以使用的东西。如果我理解正确的话,.extend不会将其作为列表添加,而是作为单个数字添加。我应该改变什么,或者我应该如何构建它?
请原谅我知识有限,半周前我刚开始用python编程。谢谢你的帮助!
BaseRow = []
for j in range (0, columns):
BaseRow.append(0)
Grid = []
for j in range (0, rows):
Grid.append(BaseRow)
执行此操作时,BaseRow的同一实例会多次附加到Grid。因此,如果您更改网格中的偶数行,效果将影响所有行,因为它基本上是所有行中列表的相同实例。
如果您想将BaseRow的副本附加到Grid,请使用以下代码:
for j in range(0, rows):
Grid.append(BaseRow[:])
您也可以使用列表理解:
Grid = [[0 for j in range(0, columns)] for i in range(0, rows)]
Columns = 3
和rows = 4
:的输出
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
设置Grid[0][0] = 1
:后的输出
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
如果你问我,我随时都会使用列表理解,因为它非常干净和简单:
columns, rows = 3, 3
lst = [[0 for j in range(columns)] for i in range(rows)] # List of List with 3 Columns and 3 Rows
lst[0][0] = 1 # modifying a member
print (lst) # Print the result
# Result: [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
我个人更喜欢列表理解,但您的代码只需要很少的更改,它会很好地为您服务。您添加列表,并在该列表中添加元素:
matrix = []
for i in range(3):
matrix.append([])
for j in range(4):
matrix[-1].append(0)
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
matrix[0][0] = 1
print(matrix)
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]