可能重复:
Python 列表列表中的意外功能
Python 列表混淆
考虑以下代码:
a = [[]] * 3
a[1].append("foo")
我希望 的值a
变为:
[[], ["foo"], []]
相反,每个元素a
都会更新:
[["foo"], ["foo"], ["foo"]]
有人可以解释为什么列表的每个元素都更新了,而不仅仅是定义的元素(a[1]
)?我的逻辑有什么根本错误吗?
为了它的价值,我正在运行 Python2.7
可能重复:
Python 列表列表中的意外功能
Python 列表混淆
考虑以下代码:
a = [[]] * 3
a[1].append("foo")
我希望 的值a
变为:
[[], ["foo"], []]
相反,每个元素a
都会更新:
[["foo"], ["foo"], ["foo"]]
有人可以解释为什么列表的每个元素都更新了,而不仅仅是定义的元素(a[1]
)?我的逻辑有什么根本错误吗?
为了它的价值,我正在运行 Python2.7
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 个内部列表对象并将其放入外部对象中。
我想你会发现正在发生的事情是 python 正在做的是创建:
outer_list = []
inner_list = []
outer_list = [inner_list,inner_list,inner_list]
或者更清楚地解释它,
outer_list
内部列表创建一次,然后inner_list
复制* 3
到outer_list
中,这意味着所有 3 个列表outer_list
实际上是对相同inner_list
复制 3 次的引用。