0

可能重复:
Python 列表列表中的意外功能
Python 列表混淆

考虑以下代码:

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

我希望 的值a变为:

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

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

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

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

为了它的价值,我正在运行 Python2.7

4

2 回答 2

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 个内部列表对象并将其放入外部对象中。

于 2012-04-21T14:31:25.873 回答
0

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

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

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

于 2012-04-21T14:31:28.773 回答