【问题标题】: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() 参数是否应用于空列表而得到不同的结果呢?

【问题讨论】:

    标签: python


    【解决方案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 postthis SO answerall 可以被认为是“真正的元素和元素一样多”。由于空集没有真正的元素,也没有元素,所以它返回真,因为 0 等于 0。any 可以认为是“至少有一个……”,由于集合是空的,所以至少没有一个因为连一个元素都没有。因此all 为空集返回真,any 为空集返回假。

    【讨论】:

      【解决方案2】:

      这个定义背后的逻辑推理如下:

      any存在量词相关,而all通用量词相关,并遵循它们的逻辑规范。

      any 翻译为至少有一个[] 的至少一个元素评估为真

      https://math.stackexchange.com/questions/281735/quantification-over-the-empty-sethttps://math.stackexchange.com/questions/202452/why-is-predicate-all-as-in-allset-true-if-the-set-is-empty -

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 2023-02-07
        • 2022-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多