为啥空列表中的任何一个都返回不同的东西?
Posted
技术标签:
【中文标题】为啥空列表中的任何一个都返回不同的东西?【英文标题】:Why do any and all on an empty list return different things?为什么空列表中的任何一个都返回不同的东西? 【发布时间】:2017-07-29 20:28:11 【问题描述】:在 Joel Grus 的 Data Science from Scratch 的第 2 章中,提供了以下示例:
all([ ]) # True, no falsy elements in the list
any([ ]) # False, no truthy elements in the list
根据 Grus 的说法,Python 将 []
(一个空列表)视为“虚假”参数。那么为什么我们会根据 all()
或 any()
参数是否应用于空列表而得到不同的结果呢?
【问题讨论】:
【参考方案1】:每the documentation of all
:
all(iterable)
如果可迭代对象的所有元素都为真(或者如果可迭代对象为空),则返回
True
。
还有documentation for any
:
any(iterable)
如果可迭代的任何元素为真,则返回
True
。 如果iterable为空,返回False
。
一个空的可迭代[]
是错误的,但这并不重要,因为返回值只是通过实现。
如果您想知道为什么会发生这种情况,这只是实施的结果。如果您从文档中查看 all
的等效代码:
def all(iterable): for element in iterable: if not element: return False return True
由于这个特定的实现,如果iterable为空,则for
循环将被完全跳过,因为没有元素。因此,它返回True
。对于any
,文档提供了等效代码:
def any(iterable): for element in iterable: if element: return True return False
它为空的可迭代对象返回 False
的原因与 all
返回 True
的原因相同。由于列表中没有元素,因此跳过了for
循环并返回False
。
这个实现是有道理的,因为空集逻辑使all
返回真,见this Math.SE post 和this SO answer。 all
可以被认为是“真正的元素和元素一样多”。由于空集没有真正的元素,也没有元素,所以它返回真,因为 0 等于 0。any
可以认为是“至少有一个……”,由于集合是空的,所以至少没有一个因为连一个元素都没有。因此all
为空集返回真,any
为空集返回假。
【讨论】:
【参考方案2】:这个定义背后的逻辑推理如下:
any
与存在量词相关,而all
与通用量词相关,并遵循它们的逻辑规范。
将any
翻译为至少有一个:[]
的至少一个元素评估为真
见https://math.stackexchange.com/questions/281735/quantification-over-the-empty-set 或https://math.stackexchange.com/questions/202452/why-is-predicate-all-as-in-allset-true-if-the-set-is-empty -
【讨论】:
以上是关于为啥空列表中的任何一个都返回不同的东西?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 null 函数而不是 == [] 来检查 Haskell 中的空列表?
为啥 Woocommerce API GET 请求返回一个空的购物车项目列表