2014-03-06 25 views
1

最近我發現Python列表和字典可以嵌套在多級這樣python列表和字典可以無限嵌套嗎?

a = {'a1':[{'a2':{'a3':[4,5,6]}}]} 

所以我想問一下是有嵌套層次技術限制? 如果沒有,是否有一個傳統的限制嵌套的級別,它是什麼?

回答

5

唯一的限制是內存。考慮到無限的內存,你可以無限地嵌套Python對象。

演示:

>>> root = lst = [] 
>>> levels = 0 
>>> while True: 
...  lst.append([]) 
...  lst = lst[-1] 
...  levels += 1 
...  if levels % 1000000 == 0: # every 1 million 
...   print levels 
... 
1000000 
2000000 
3000000 
4000000 
5000000 
6000000 
7000000 
8000000 
9000000 
10000000 
11000000 
# .... 
# [ slower and slower as the system starts to swap ] 
# .... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 

對於我的理智我殺了它在30個億個對象,雖然着想。

+0

我在空閒只是踢嘗試這樣做了,並得到了 – WeaselFox

+0

不能嵌套他們「同時得到一個列表的再版最大遞歸深度超出」用文字無限制,並且在編寫遞歸代碼來創建嵌套數據結構時,您還必須考慮最大遞歸深度。 –

+1

@WeaselFox:不要混淆遞歸限制時*印刷*你可以有多深棧對象引用一個嵌套的對象。 –

2

對於您可以創建的數據結構的嵌套深度(除了它所消耗的內存之外)沒有實際的限制,但是對於如何將代碼作爲文字編寫的數據結構嵌入代碼 。例如,這裏有一個快速測試:

>>> eval(70*'['+70*']') 
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] 
>>> eval(80*'['+80*']') 
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]   
>>> eval(90*'['+90*']') 
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] 
>>> eval(100*'['+100*']') 
s_push: parser stack overflow 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 

這實際上並沒有用完的總內存,但跑出來的堆棧空間而試圖解析數據結構。您可以創建深層嵌套的列表,但您無法直接在源代碼中編寫它們。

你想?不正常。也許你想手動創建一個鏈表。這可能是創建深度嵌套結構的原因。

1

你甚至可以做無限循環:

>>> l = [1] 
>>> l.append(l) 
>>> l 
[1, [...]] 
>>> l[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1] 
[1, [...]] 
>>> 
+0

這是*自引用*,不堆疊不同的對象。 –

+0

我認爲這是相關的:我有一個包含包含包含包含包含包含包含嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表的列表... – hivert

+0

你有一個包含對自身的引用的列表。 *這不是一回事*。可愛,但在這裏無關緊要。 –