多次在列表中添加列表,从而保留了更改python

时间:2019-02-04 12:29:39

标签: python python-2.7 list

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

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进行编程。感谢您的帮助!

3 个答案:

答案 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 = 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]]

答案 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]]