多次终止列表中的列表,保留了在python中更改特定元素的能力



我想创建一个具有可变行数和列数的网格。我所做的就是这个

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 = 3rows = 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]]

最新更新