我剛剛看到一個如下的輸出 - 只是想知道這裏發生了什麼。python list index是同一個列表
>>> l = [1,2,3,4]
>>> l[0]=l
>>> l
[[...], 2, 3, 4]
爲什麼l [0]的值是這樣顯示的?任何人都可以解釋爲什麼這種行爲。 我在想它會像[[1,2,3,4],2,3,4]一樣迴歸。
乾杯, 卡萊
我剛剛看到一個如下的輸出 - 只是想知道這裏發生了什麼。python list index是同一個列表
>>> l = [1,2,3,4]
>>> l[0]=l
>>> l
[[...], 2, 3, 4]
爲什麼l [0]的值是這樣顯示的?任何人都可以解釋爲什麼這種行爲。 我在想它會像[[1,2,3,4],2,3,4]一樣迴歸。
乾杯, 卡萊
它顯示了...
,否則它會無限遞歸。
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
使用列表的副本,以避免無限遞歸:
In [10]: l = [1,2,3,4]
In [11]: l[0] = l[:]
In [12]: l
Out[12]: [[1, 2, 3, 4], 2, 3, 4]
,如果您已經使用了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
這是什麼東西與實際地址得到分配,並轉向一些有線輸出?因爲,當我嘗試下面的一個時,它工作正常。 >>> l = [1,2,3,4] >>> l [1] = 1 [:] >>> l [1,[1,2,3,4],3,4] – AKK 2013-03-10 17:13:43
@Kalai:我的答案是否可以解釋? 'l [:]'複製列表,否則它仍然是原始指針。 – 2013-03-10 17:18:42