首页 > 解决方案 > 为什么使用 __iter__() 方法在实例上调用 list() 会导致递归?

问题描述

我正在使用 Python 3.7,我有这样的东西:

class Foo:
    def __iter__(self):
        yield from self.some_sequence

    def __len__(self):
        return len(list(self))


>>> len(Foo())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in __len__
  File "<stdin>", line 5, in __len__
  File "<stdin>", line 5, in __len__
  [Previous line repeated 496 more times]
RecursionError: maximum recursion depth exceeded

我确定我错过了一些明显的原因来解释为什么这总是会导致递归错误,但我想不出为什么。

标签: python

解决方案


要计算len你的对象,你调用list你的对象。

要确定要保留多少空间,请list调用len您的对象。(它使用 PyObject_LengthHint, 尝试len__length_hint__。)

要计算len您的对象的...

有无限递归。

__len__(即使它有效,这也是一个非常低效的实现 -__len__通常预计是恒定时间。)


推荐阅读