2010-07-02 74 views
8
A = [[]]*2 

A[0].append("a") 
A[1].append("b") 

B = [[], []] 

B[0].append("a") 
B[1].append("b") 

print "A: "+ str(A) 
print "B: "+ str(B) 

收率:[[]] * 2在Python中做什麼?

A: [['a', 'b'], ['a', 'b']] 
B: [['a'], ['b']] 

人們會期望的是,列表將是相同的作爲B列表中,不是這種情況下,兩個附加語句被應用到A [0]和A [1 ]。

爲什麼?

+0

有對列表的在這個線程Python的*運營商的一個很好的解釋: http://stackoverflow.com/questions/974931/multiply-operator-applied-to-listdata-structure – 2010-07-02 01:19:33

+7

@S。洛特:對我來說很清楚:兩種非常相似的形式,[]] * 2和[[],[]]在以相同方式操作時會產生非常不同的結果。爲什麼? – 2010-07-02 01:31:53

回答

16

A = [[]]*2創建一個包含2個相同元素的列表:[[],[]]。 元素是相同的確切列表。 所以

A[0].append("a") 
A[1].append("b") 

都追加和"a""b"相同的列表。

B = [[], []]用2個不同的元素創建一個列表。

In [220]: A=[[]]*2 

In [221]: A 
Out[221]: [[], []] 

這表明A兩個元件是相同的:

In [223]: id(A[0])==id(A[1]) 
Out[223]: True 

In [224]: B=[[],[]] 

這表明B兩個元件是不同的對象。

In [225]: id(B[0])==id(B[1]) 
Out[225]: False