【发布时间】:2014-11-01 21:34:37
【问题描述】:
阅读文档后,我注意到内置函数 len 不支持所有可迭代对象,仅支持序列和映射(和集合)。在阅读之前,我一直认为len 函数使用了迭代协议来评估对象的长度,所以读到这里我真的很惊讶。
我阅读了已经发布的问题(here 和 here),但我仍然感到困惑,我仍然不明白为什么不允许 len 处理所有可迭代对象的真正原因。
这是一个比实施更概念性/逻辑性的原因吗?我的意思是当我问一个对象的长度时,我问的是一个属性(它有多少个元素),一个作为生成器的对象没有的属性,因为它们内部没有元素,产生元素。
此外,生成器对象可以产生无限的元素,带来未定义的长度,这是其他对象(如列表、元组、字典等)无法发生的事情......
我是对的,还是我没有考虑更多见解/更多内容?
【问题讨论】:
-
我不认为你会得到比你已经看到的更好的答案。
-
这也让我很困惑。为什么 python 在生成器上支持
sum或all,但不支持len?这基本上是同一类东西。 PEP 或邮件列表中的某处必须有解释... -
你会在迭代器上使用
len做什么?找出它有多长的唯一方法是迭代它,所以一旦你发现它有多长(假设它不是无限长)你已经消耗了它并且不能将它用于任何事情否则。 -
@EMS - 您的概括可能是正确的。在 Python 中,我希望
len()始终是O(1)并且是非破坏性的。因此,我不认为它对迭代器有效。 -
@EMS:如果没有成员持有容器的长度,唯一知道终点在哪里的方法就是哨兵值。哨兵值比长度成员更令人头疼。想象一下,如果附加到一个列表需要您遍历整个内容以找到它的结尾。此外,保持长度不是 O(n);每个可能改变大小的操作都需要 O(1),而且它节省的时间比它花费的时间要多。
标签: python python-3.x