for循环中出现RecursionError求助:字符串扁平化递归报错
问题原因
当代码处理到字符串'abc'时,由于字符串属于Iterable类型,会进入递归调用flatten('abc')。遍历'abc'的每个字符(比如'a')时,单个字符同样是str类型(也属于Iterable),于是会再次递归调用flatten('a')。而'a'的迭代元素还是'a',这就导致了无限递归,最终触发RecursionError。
解决方法
需要在判断是否递归时,排除字符串类型——只有当元素是可迭代对象但不是字符串时,才进行递归扁平化。修正后的代码如下:
from collections.abc import Iterable def flatten(items): for x in items: # 仅对非字符串的可迭代对象递归 if isinstance(x, Iterable) and not isinstance(x, str): yield from flatten(x) else: yield x items = [2, [3, 4, [5, 6], 7], 8, 'abc'] for x in flatten(items): print(x, end=', ')
运行结果
执行后会输出:
2, 3, 4, 5, 6, 7, 8, a, b, c,
这样就符合预期的扁平化效果,同时避免了无限递归的问题。
内容的提问来源于stack exchange,提问作者Xiaokuan Wei
相关产品推荐
相关产品推荐

