如何创建带有 python 列表的“矩阵”?[复制]

How do I create a "matrix" with a python list? [duplicate]

提问人:Grzegorz Lippe 提问时间:8/12/2022 更新时间:8/13/2022 访问量:865

问:

我有一个问题,我不能使用 numpy,我第一次偶然发现 python 中的一些奇怪的东西。

下面是一个最小的示例:

a = [[0] * 3] * 3
print(a)
# will output [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# as expected

a[1][1] = 1
# I expect : [[0, 0, 0], [0, 1, 0], [0, 0, 0]],
# but I get:

print(a)
# will output [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
#                  ?                     ?

如何创建列表列表,其中所有元素都相互独立?

如果有人打扰,你能解释一下,那里会发生什么吗?

Python 列表 指针 按引用传递

评论

0赞 8/12/2022
因为您引用的是同一个列表。使用 numpy 创建矩阵。
0赞 Robert Haas 8/13/2022
外部创建一个包含三个条目的列表,但问题是这三个条目中的每一个都引用同一个对象,即内部列表。因此,如果对该对象进行寻址并对其进行更改,则其他两个条目也引用已更改的对象。* 3
0赞 Timus 8/13/2022
另请参阅此处
0赞 Grzegorz Lippe 8/14/2022
好吧,正如我所说,我不能使用 numpy。我正在做一个在线课程,这个特定问题的自动分级器环境不包含numpy。而且我不应该需要它来初始化 2D 列表。

答:

2赞 Addison Schmidt 8/12/2022 #1

这里发生的情况是,对同一列表的引用(从 获取的引用)在新列表中放置了 3 次,而不是在新列表中放置了 3 个不同的列表。做你想做的事的一种方法是:[0] * 3

a = [[[0] * 3] for _ in range(3)]

评论

0赞 Grzegorz Lippe 8/15/2022
好的,但是为什么 Python 不在内部语句中这样做呢?如果 python 使用 创建引用,那么为什么它的行为不是这样的:* nPython a[1][1] = 1 # Output [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
0赞 Eldellano 8/12/2022 #2
a = list()
n = 3
for i in range(n):
  a.append([0] * n)
  
a[1][1] = 1
print(a)
1赞 Javad 8/12/2022 #3

使用以下所有代码片段,您可以使用 python 创建一个 3 * 3 矩阵:

第一种方法:在每行的循环内追加列

rows = 3
cols = 3

lst = []
matrix = []
for i in range(rows):
    for j in range(cols):
        lst.append(0)
    matrix.append(lst)
    lst.clear()

print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]

第二种方法:1 个列表推导在外部,1 个串联操作在里面

rows = 3
cols = 3
 
matrix = [[0] * cols for _ in range(rows)]

print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]

第三种方法:1 个列表推导在里面,1 个串联运算在外

rows = 3
cols = 3
 
matrix = [[0 for _ in range(cols)]] * rows

print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]

第四种方法:使用 numpy

import numpy as np
 
rows = 3
cols = 3
size = rows*cols
 
matrix = np.array([0]*size).reshape(rows,cols)

print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
1赞 Robert Haas 8/13/2022 #4

以下是我不使用而是用列表推导式替换它的方法:*

a = [[0 for _ in range(3)] for _ in range(3)]