了解列表列表

时间:2012-04-21 14:26:11

标签: python list

  

可能重复:
  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

2 个答案:

答案 0 :(得分: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个内部列表对象并将其放入外部对象。

答案 1 :(得分:0)

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

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

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