我想创建一个具有可变数量的行和列的网格。我要做的就是这个
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进行编程。感谢您的帮助!
答案 0 :(得分:1)
BaseRow = []
for j in range (0, columns):
BaseRow.append(0)
Grid = []
for j in range (0, rows):
Grid.append(BaseRow)
执行此操作时,BaseRow的同一实例将多次附加到Grid。因此,如果您在Grid中更改偶数行,效果将在所有行上出现,因为它基本上是所有行中list的相同实例。
如果要将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]]
答案 1 :(得分: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]]
答案 2 :(得分: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]]