【发布时间】:2018-09-13 11:30:51
【问题描述】:
在下面的代码中,我遇到了RecursionError: maximum recursion depth exceeded。
def unpack(given):
for i in given:
if hasattr(i, '__iter__'):
yield from unpack(i)
else:
yield i
some_list = ['a', ['b', 'c'], 'd']
unpacked = list(unpack(some_list))
如果我使用some_list = [1, [2, [3]]],这可以正常工作,但当我尝试使用字符串时就不行了。
我怀疑我缺乏 Python 知识。任何指导表示赞赏。
【问题讨论】:
-
字符串本身是可迭代的,它们迭代的东西是字符串。
for x in 'a'产生'a'本身。 -
尝试
some_list = []; some_list.append(some_list); unpacked = list(unpack(some_list))看看深度>1000 的任何事物都可能发生这种情况。所以剩下的问题是为什么每个字符串的深度>1000,这是 wim 的回答(和 BallpointBen 的评论)解释的。 -
@abarnert 对于你的情况,是不是
__iter__forlist返回自己,自然是无休止的递归? -
@user7865286 是的——或者,也许更简单地说,列表包含自身:
some_list[0] is some_list。我认为这不会比s = 'a',s[0] is s更令人惊讶,所以它有助于阐明问题,但现在我想一想,有多少人真正了解 Python 中的递归列表?唯一真正明显的例子是一个显式迭代自身的类,它太大且令人分心,不值得评论;最好像 BallpointBen 那样直接去s[0] is s获取字符串。