【问题标题】:Initializing an m x n array of 0s in Python [duplicate]在Python中初始化一个由0组成的m x n数组[重复]
【发布时间】:2023-03-20 22:21:01
【问题描述】:

我想创建一个 m x n 维度的 0 嵌套数组。稍后我将遍历数组并分配值。

如果我这样做:

l = [[0] * 3] * 3
for i in range(3):
    for j in range(3):
        if i == 0:
            l[i][j] = 1

我的条件似乎并不适用,并且无论 i 是什么,每个值都分配给列表。我知道问题是由复制第一行代码中的 0 列表引起的。所以我像这样对每个内部列表进行了切片来修复它:

l = [[0] * 3] * 3
for i in range(3):
    l[i] = l[i][:]
    for j in range(3):
        if i == 0:
            l[i][j] = 1

这感觉是多余的,我想知道是否有更好的方法来初始化嵌套列表。

【问题讨论】:

  • 请注意,如果您使用的是numpy,这将是numpy.zeros((m, n))

标签: python


【解决方案1】:

您的问题是 python 中的列表是 mutable 并且当使用 * 复制它们时,您实际上是将引用复制到同一个列表,而不是创建新列表。

>>> l = [[0]*3]*3
>>> l
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> l[0][0] = 1
>>> l
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

您想通过单独创建主题来使您的列表与众不同:

>>> l = [[0 for _ in range(3)] for _ in range(3)]  # each list created by it own, and not as you did when it just a copy to the reference to the same list.
>>> l[0][0] = 1
>>> l
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]

【讨论】:

  • 您的两个示例中的列表都是可变的; 问题是引用复制。
  • 我指的是开场白:“你的问题是python中的列表是可变的”;我不会将实际问题埋在代码注释中。
  • 知道了,你是对的,更新了答案。
  • 谢谢,这正是我需要的。
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 2021-09-11
  • 2012-04-30
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多