Python的列表和字典可以无限嵌套吗?
最近我发现,Python中的列表和字典可以嵌套多层,就像这样:
a = {'a1':[{'a2':{'a3':[4,5,6]}}]}
所以我想问一下,嵌套的层数有没有技术上的限制?如果没有,那有没有一个常规的嵌套层数限制呢?这个限制是什么?
3 个回答
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, [...]]
>>>
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
这个测试并没有耗尽总内存,但在解析这个数据结构的时候,栈空间用完了。你可以创建这么深的嵌套列表,只是不能直接在源代码里写出来。
那你会想这样做吗?一般来说不会。也许你想手动创建一个链表,这可能是需要创建一个深度嵌套结构的原因。
6
唯一的限制就是内存。如果你有无限的内存,你可以无限地嵌套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
为了我的心理健康,我在创建了3000万个对象后就停止了。