def flatten(S):
result = []
for item in S:
if is_listlike(item) and not is_listlike(item[0]):
result.append(item)
else:
result.extend(flatten(item))
return result
def flat(S):
if S == []:
return S
if isinstance(S[0], list):
return flat(S[0]) + flat(S[1:])
return S[:1] + flat(S[1:])
当我打电话给flat(listoflists)
时,它似乎抛出了
RuntimeError: maximum recursion depth exceeded while calling a Python object
但是当我拨打flatten(listoflists)
时,它可以正常工作。
我想知道上面两个函数之间的区别是什么,它们应该展平嵌套的列表列表,但flat()
有时会抛出错误消息而flatten()
从不抱怨。
答案 0 :(得分:2)
问题是flat()
是递归的。它不会导致无限递归,但它可能超过最大递归深度,列表足够大。 Python没有实现尾递归优化,所以即使列表没有嵌套列表,也可以轻松达到最大深度。
另一方面,flatten()
主要是迭代的。它仅在遇到嵌套列表时才会递归,因此它也可以通过正确的输入达到最大深度。如果您打算使用大型列表,这是一个更合适的解决方案。
答案 1 :(得分:0)
第二个函数是递归函数,python具有最大递归深度限制。您可以使用以下代码来增加限制。
import sys
sys.setrecursionlimit(2000)