2013-03-10 26 views
1

我剛剛看到一個如下的輸出 - 只是想知道這裏發生了什麼。python list index是同一個列表

>>> l = [1,2,3,4] 
>>> l[0]=l 
>>> l 
[[...], 2, 3, 4] 

爲什麼l [0]的值是這樣顯示的?任何人都可以解釋爲什麼這種行爲。 我在想它會像[[1,2,3,4],2,3,4]一樣迴歸。

乾杯, 卡萊

+0

這是什麼東西與實際地址得到分配,並轉向一些有線輸出?因爲,當我嘗試下面的一個時,它工作正常。 >>> l = [1,2,3,4] >>> l [1] = 1 [:] >>> l [1,[1,2,3,4],3,4] – AKK 2013-03-10 17:13:43

+0

@Kalai:我的答案是否可以解釋? 'l [:]'複製列表,否則它仍然是原始指針。 – 2013-03-10 17:18:42

回答

5

它顯示了...,否則它會無限遞歸。

Python中的列表對象是一個指向列表的指針 - 分配它像l[0] = l不會複製。例如,嘗試,即使你從來沒有改變過l1明確,現在已經追加到

l1 = [1, 2, 3, 4] 
l2 = [1, 2] 
l2[0] = l1 
print l2 
# [[1, 2, 3, 4], 2] 
l2[0].append(5) 
print l1 
# [1, 2, 3, 4, 5] 

通知。

因此,當您在自己的內部放置一個列表時,列表中的那個項目是仍然是指向整個列表的鏈接。上面的代碼後,嘗試做:

l[1] # ==> 2 
l[0][1] # ==> 2 
l[0][0][1] # ==> 2 
3

使用列表的副本,以避免無限遞歸:

In [10]: l = [1,2,3,4] 

In [11]: l[0] = l[:] 

In [12]: l 
Out[12]: [[1, 2, 3, 4], 2, 3, 4] 
0

,如果您已經使用了PrettyPrinter,輸出會一直自我解釋

>>> l = [1,2,3,4] 
>>> l[0]=l 
>>> l 
[[...], 2, 3, 4] 
>>> pp = pprint.PrettyPrinter(indent = 4) 
>>> pp.pprint(l) 
[<Recursion on list with id=70327632>, 2, 3, 4] 
>>> id(l) 
70327632 
相關問題