名单

2012-04-21 37 views
0
的了解列表

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

+3

这已被问过千次..让我找到一个重复:) – 2012-04-21 14:28:33

+0

谢谢。很难找到这个问题的正确标题,所以我无法轻松找到重复。谢谢你指出:) – rahmu 2012-04-21 14:30:35

+0

@rahmu:是的,我知道,这是不幸的,但它肯定不是你的错:)玩得开心。 – 2012-04-21 14:30:57

回答

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点内列出的对象,并提出了到外部对象。

+2

通常的做法是使用列表理解:'lst = [[] for _ in range(3)]' – 2012-04-21 14:39:14

0

我想你会发现正在发生的事情是什么蟒蛇正在做的是创造:

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

或更清楚地解释它, outer_list和内部列表创建一次,然后inner_list被复制* 3转化为outer_list,这意味着outer_list中的所有3个列表实际上是一个参考拷贝了3次相同的inner_list