【问题标题】:Understanding lists of lists [duplicate]了解列表列表[重复]
【发布时间】:2012-04-21 14:26:11
【问题描述】:

可能重复:
Unexpected feature in a Python list of lists
Python list confusion

考虑以下代码:

a = [[]] * 3
a[1].append("foo")

我希望a 的值变为:

[[], ["foo"], []]

相反,a 的每个元素都会更新:

[["foo"], ["foo"], ["foo"]]

谁能解释一下为什么列表中的每个元素都更新了,而不仅仅是定义的元素(a[1])?我的逻辑有什么根本错误吗?

值得我运行 Python2.7

【问题讨论】:

  • 这已经被问了数千次了。让我找一个重复的:)
  • 谢谢。这个问题很难找到合适的标题,所以我很难找到重复的。感谢您指出:)
  • @rahmu:是的,我知道,这很不幸,但这肯定不是你的错 :) 玩得开心。
  • 是的,之前有人指出,除非您知道它是什么,否则您无法搜索此问题。
  • @rahmu:Symbolhound 非常擅长查找小代码 sn-ps:Search results for [[]] * on Stackoverflow 第三个结果已经是重复的了。

标签: python list


【解决方案1】:

Python 中的列表是对象,这意味着当您将列表分配给另一个变量时,更改任何一个都会改变实际的列表,例如

a = []
b = a
b.append("hi")
print a
// a is now ["hi"]

当你做作业时

a = [[]] * 3

说的也一样

inner_list = []
outer_list = [inner_list, inner_list, inner_list]

换句话说,所有的内部列表都是相同的对象。不像你想的那样不同的对象。

要达到你想要的效果,你应该这样做:

outer_list = []
for i in range(0, 3):
    outer_list.append([])

它创建了 3 个内部列表对象并将其放入外部对象中。

【讨论】:

  • 通常的方法是使用列表理解:lst = [[] for _ in range(3)]
【解决方案2】:

我想你会发现正在发生的事情是,python 正在做的是创造:

outer_list = []
inner_list = []
outer_list = [inner_list,inner_list,inner_list]

或者更清楚地解释它, outer_list 和内部列表创建一次,然后将inner_list 复制到* 3outer_list,这意味着outer_list 中的所有3 个列表实际上是对相同inner_list 的引用复制了3 次。

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 2019-08-13
    • 2013-01-26
    • 2016-05-02
    • 2019-04-05
    • 2011-06-15
    • 2013-11-11
    • 2017-11-28
    相关资源
    最近更新 更多