|
|
1
8
我认为这是,如果有的话,那一段的文档错误,而不是
如果您只是将迭代器用作迭代器,那么一旦它提升,它将继续提升。但是,如果您调用迭代器协议之外的方法,那么实际上您不再将其用作迭代器,而是将其用作迭代器之外的其他东西。在这种情况下,如果对象有意义的话,它看起来是合法的,甚至是惯用的。只要当它作为一个迭代器嘎嘎作响时,它从不重新填充自己,只有当它嘎嘎作响时,它作为其他类型的迭代器超越了它。 在C++中类似的情况下,语言委员会很可能声明这会破坏可替代性,因此迭代器一旦调用了这样的方法就成为无效的迭代器,即使语言不能强制执行。或者为可重复填充的迭代器提出一个全新的协议。(当然C++迭代器与Python迭代器的内容完全相同,但希望你明白我的意思。) 但在Python中,实用性胜过纯粹性。我很确定Guido从一开始就打算这样做,并且允许一个对象这样做,并且仍然被认为是一个迭代器,核心开发人员继续打算这样做,只是没有人考虑过如何编写足够严格的东西来准确地解释它,因为没有人问过。
|
|
2
2
是的,根据
stdtypes documentation
如果您使用的代码假定迭代器严格遵循迭代器协议,那么这是值得记住的。举一个例子,使用Python实现
September 2008 archives 为什么“坏迭代器”坏了? Miles :
我认为这种行为在语言上不太可能改变(“实用胜过纯粹”),但也许文档中的语言会软化。如果你想遵循的话,有一个现存的开放性问题: issue23455 |
|
|
Julia · 矢量中相加为总和S的值的数量 3 年前 |
|
|
apetrai · 我应该如何假设算法使用哪种迭代器类别? 4 年前 |
|
|
Pratik · 不使用Java DeepCopy迭代器 8 年前 |
|
|
PanDe · 将两个列表合并为一个Dict、Tuple 8 年前 |
|
|
bisarch · 迭代哈希集并在每次迭代中删除多个元素 8 年前 |