我指的是以下python代码
all(a==2 for a in my_list)
如果 my_list 中的所有元素都是 2,我希望上面的代码返回 True。但是当我让 my_list 为空并运行它时
my_list = []
all(a==2 for a in my_list)
它也返回 True 。我对这种行为感到困惑。它不应该返回 False,因为 my_list 中没有值为 2 的元素吗?
我指的是以下python代码
all(a==2 for a in my_list)
如果 my_list 中的所有元素都是 2,我希望上面的代码返回 True。但是当我让 my_list 为空并运行它时
my_list = []
all(a==2 for a in my_list)
它也返回 True 。我对这种行为感到困惑。它不应该返回 False,因为 my_list 中没有值为 2 的元素吗?
应用于空列表的“全部”是“空虚的”,这很容易确认:
>>> all([])
True
类似地,“如果 0 = 1 则月亮是方形的”是正确的。更一般地说,“所有 P 都是 Q”——如果没有 P,那么该陈述被认为是正确的,因为它可以正式地被捕获为“对于所有 x,如果 x 是 P,那么 x 是 Q”。最终,这些都是真的,因为只要前提(第一个子句)为假,条件逻辑运算符(if-then)的计算结果为真:“如果假则真”计算为真。回想一下“if A then B”等价于“(not A) or B”。
新增 1-2022和 Python 列表
的情况下all
,布尔值all(my_list)
是
"for all items `x` in `my_list`, the value of `x` is truthy".
当my_list
为空时,该值为 True。再次,“为所有人”,all
不提出存在的主张。
在 Python 伪代码中,all
大致是这样工作的:
val = True
for x in my_list:
if not x:
val = False
break
# assert val == all(my_list)
考虑 的递归定义all
:
def all(L):
if L:
return L[0] and all(L[1:])
else:
???
如果 in 中的每个元素都L
为真,那么 in 中的第一项也必须L
为真,并且那all(L[1:])
是真的。这对于包含多个项目的列表很容易看到,但对于包含一个项目的列表呢?显然,如果唯一一项为真,则每一项都为真,但在这种情况下,我们的递归公式如何工作?定义all([])
为真使算法工作。
另一种看待它的方式是,对于任何不正确的列表,L
我们应该能够识别出至少一个不正确的元素 。但是,当空时没有这样的,所以我们有理由说这是真的。all(L)
a
a
L
L
all([])
相同的论点适用于any
. 如果any(L)
是真的,我们应该能够识别出其中至少一个元素L
是真的。但是由于我们不能为空列表L
,我们可以说这any([])
是错误的。一个递归实现any
支持这一点:
def any(L):
if L:
return L[0] or any(L[1:])
else:
return False
如果L[0]
为真,我们可以在不进行递归调用的情况下返回真,因此假设L[0]
为假。我们到达基本情况的唯一方法是如果没有元素L
为真,所以False
如果我们达到它,我们必须返回。
其他答案已经很好地解释了原因。作为快速修复,您可以使用:
my_list and all(a==2 for a in my_list)
从办公文件。
all(iterable)
如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。相当于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
2.5 版中的新功能。
any(iterable)
如果可迭代的任何元素为真,则返回真。如果可迭代对象为空,则返回 False。相当于:
def any(iterable):
for element in iterable:
if element:
return True
return False
2.5 版中的新功能。