python - 为什么使用 __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
我确定我错过了一些明显的原因来解释为什么这总是会导致递归错误,但我想不出为什么。
解决方案
要计算len
你的对象,你调用list
你的对象。
要确定要保留多少空间,请list
调用len
您的对象。(它使用 PyObject_LengthHint
, 尝试len
和__length_hint__
。)
要计算len
您的对象的...
有无限递归。
__len__
(即使它有效,这也是一个非常低效的实现 -__len__
通常预计是恒定时间。)
推荐阅读
- linux - 遍历一个目录并检查它是否存在于另一个目录中
- php - 学说查询生成器 SELECT DISTINCT 抛出错误
- android - 如何检测WiFi接入点是否刚刚在Android中失去了互联网连接
- c# - 从 DataGridView 复制到 Excel 工作表并保持工作表格式
- node.js - Electron JS/Node JS 桌面应用程序作为本地网络网络服务器
- devops - SaltStack:没有找到顶级文件或master_tops数据匹配项
- ruby-on-rails - 解析json时如何保存树形结构?
- ios - UIStackView 隐藏动画无法正常工作
- c# - 如果单击行并将其列从 true 更改为 false,我如何在 DataGrid 中检测到,反之亦然?
- javascript - 如何在 javascript 中使用另一个数组中的属性过滤一个数组中的对象?