为啥空列表中的任何一个都返回不同的东西?

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 -

【讨论】:

以上是关于为啥空列表中的任何一个都返回不同的东西?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Perl 映射不返回任何内容?

为啥与空列表连接时返回列表但与新列表连接时不返回?

为啥使用 null 函数而不是 == [] 来检查 Haskell 中的空列表?

为啥 Woocommerce API GET 请求返回一个空的购物车项目列表

为啥这个 AngularJS 代码中的 HTTP POST 返回空? [复制]

当 XPath 验证器返回正确结果时,为啥 XmlNode.SelectNodes 返回空列表?