为何Python内置函数all处理空字符串字符检查时返回True?
问题:空字符串传入
all()为何返回True? 我编写了一个函数,用于检查给定字符串的每个字符是否都存在于指定列表ITEMS中。该函数在多数场景下表现正常,但当输入为空字符串时,内置函数all返回True,尽管空字符串并不在ITEMS列表内。
代码示例:
ITEMS = ['a', 'b', 'c', 'd'] def check_all_chars_are_in_list(string): return all(char in ITEMS for char in string) if __name__ == "__main__": print(check_all_chars_are_in_list('saban')) # False, as expected. (1) print(check_all_chars_are_in_list('abcd')) # True, as expected. (2) print(check_all_chars_are_in_list('')) # True (why?). (3)
我手动测试空字符串是否在列表中得到False:
>>> st = '' >>> l = ['a', 'b', 'c', 'd'] >>> st in l False # As expected
原因解释
这是Python中all()函数的**空真值(vacuous truth)**特性导致的。
all(iterable)的核心逻辑是:如果可迭代对象中的所有元素都为True,返回True;如果可迭代对象是空的(没有任何元素),同样返回True——因为不存在任何违反“所有元素为真”的情况。
你的函数里,传入空字符串时,for char in string会生成一个空生成器,没有任何字符需要检查。此时all()直接触发空真值规则,返回True。
你手动测试的st in l是判断空字符串这个整体是否属于列表元素,和函数逻辑完全不同:函数是验证字符串的每个字符都在列表中,空字符串没有字符需要验证,所以all()默认返回True。
如果要让空字符串输入返回False,可以修改函数,先判断字符串是否非空:
def check_all_chars_are_in_list(string): return bool(string) and all(char in ITEMS for char in string)
内容的提问来源于stack exchange,提问作者Luiz Gabriel
相关产品推荐
相关产品推荐

