【问题标题】:Appending to 2D lists in Python [duplicate]在Python中附加到二维列表[重复]
【发布时间】:2011-12-06 10:19:34
【问题描述】:

我在 Python 中遇到了我认为很奇怪的行为,如果可能的话,我希望有人能解释一下。

我创建了一个空的 2D 列表

listy = [[]]*3

print listy

[[], [], []]

以下工作如我所料:

listy[1] = [1,2] 产生[[], [1,2], []]

listy[1].append(3) 产生[[], [1,2,3], []]

但是,当我追加到其中一个空列表时,python 会追加到所有子列表,如下所示:

listy[2].append(1) 产生[[1], [1,2,3], [1]]

谁能向我解释为什么会发生这种行为?

【问题讨论】:

  • 我想知道这个问题每月有多少次被问到。当然,这是关于 Python 的最常见问题之一(不仅仅是在 Stack Overflow 上)。来自官方 Python 文档中的常见问题解答:How do I create a multidimensional list?

标签: python list


【解决方案1】:

您还没有创建三个不同的空列表。您创建了 一个 空列表,然后创建了一个新列表,其中包含对该 same 空列表的三个引用。要解决此问题,请改用以下代码:

listy = [[] for i in range(3)]

现在运行您的示例代码会得到您可能预期的结果:

>>> listy = [[] for i in range(3)]
>>> listy[1] = [1,2]
>>> listy
[[], [1, 2], []]
>>> listy[1].append(3)
>>> listy
[[], [1, 2, 3], []]
>>> listy[2].append(1)
>>> listy
[[], [1, 2, 3], [1]]

【讨论】:

  • 这很有意义。谢谢。
  • 这是我在 Python 中遇到的最奇怪的功能。看起来几乎像一个错误。
【解决方案2】:

[[]]*3[[], [], []] 不同。

好像你说过

a = []
listy = [a, a, a]

换句话说,所有三个列表引用都指向同一个列表实例。

【讨论】:

    【解决方案3】:

    来到这里是为了了解如何将项目附加到二维数组,但线程的标题有点误导,因为它正在探索附加问题。

    我发现附加到 2D 列表的最简单方法是这样的:

    列表=[[]]

    list.append((var_1,var_2))

    这将产生一个包含 2 个变量 var_1、var_2 的条目。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2020-08-06
      • 1970-01-01
      • 2013-12-15
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多