Python “原因”;“全部”;及;任何;空列表上的结果
在Python中,内置函数和分别返回空iterable的Python “原因”;“全部”;及;任何;空列表上的结果,python,logic,Python,Logic,在Python中,内置函数和分别返回空iterable的True和False。我意识到,如果是另一种情况,这个问题仍然可以提出。但我想知道为什么会选择这种特定的行为。这是武断的吗,也就是说,可能是另一种方式,还是有潜在的原因 (我问这个问题的原因很简单,因为我从来都不记得哪个是哪个,如果我知道它背后的原理,那么我可能会问。还有好奇心。)一些类比怎么样 您有一个袜子抽屉,但它当前是空的。里面有黑色的袜子吗?没有-你根本没有袜子,所以你肯定没有黑色的。显然any([])必须返回false-如果返回t
True
和False
。我意识到,如果是另一种情况,这个问题仍然可以提出。但我想知道为什么会选择这种特定的行为。这是武断的吗,也就是说,可能是另一种方式,还是有潜在的原因
(我问这个问题的原因很简单,因为我从来都不记得哪个是哪个,如果我知道它背后的原理,那么我可能会问。还有好奇心。)一些类比怎么样 您有一个袜子抽屉,但它当前是空的。里面有黑色的袜子吗?没有-你根本没有袜子,所以你肯定没有黑色的。显然
any([])
必须返回false-如果返回true,这将违反直觉
all([])
的情况稍微困难一些。请参阅维基百科上的文章。另一个类比:如果房间里没有人,那么房间里的每个人都会说法语
从数学上讲,所有([])
都可以写入:
其中集合A为空
关于空洞的陈述是否应该被视为真实存在着相当多的争论,但从逻辑的角度来看,这是最有意义的:
所有虚真陈述都为真的主要论点如下:如上一篇文章中所解释的,命题逻辑的公理意味着,如果p为假,那么p=>Q为真。也就是说,如果我们接受这些公理,我们必须接受真空真实的陈述确实是真实的
文章还指出:
似乎没有直接的理由去选择真实;如果我们不这样做,事情就会在我们面前爆发
在Python中定义一个“vacuously true”语句以返回false将违反规则。any的一个属性是它的递归定义
any([x,y,z,...]) == (x or any([y,z,...]))
这意味着
x == any([x]) == (x or any([]))
当且仅当
any([])
定义为False时,该等式对于任何x
都是正确的。类似于所有的我认为它们是以这种方式实现的
def all(seq):
for item in seq:
if not item:
return False
return True
def any(seq):
for item in seq:
if item:
return True
return False
虽然不确定它们是以这种方式实现的,但出于普遍的兴趣,这里是GvR提出的任何/所有示例实现,如gnibbler和ABC中的引用量化器 Perl 6还认为空列表上的all()
和any()
应该作为它们各自的归约运算符的合理基本情况,因此all()
为true而any()
为false
< > >代码> >所有(A,B,C)相当于<代码> [a,b,c< /代码>,相当于<代码> a & b& c < /> >(对“连接”和“运算符”的约简,但可以忽略连接,并认为它是逻辑的,对于该帖),任何(a,b,c)< /代码>相当于<代码> [a,b,c< /代码>,这相当于a | b | c
(减少“连接或”运算符——同样,您可以假装它与逻辑相同或没有遗漏任何内容)
任何可以应用归约的运算符在归约0项时都需要有一个已定义的行为,这通常是通过具有一个自然标识元素来实现的——例如,[+]()
(零项加法归约)是0,因为0是加法标识;将零添加到任何表达式都会使其保持不变[*]()
同样是1,因为1是乘法标识。我们已经说过,所有的
都等同于[&]
,任何的
都等同于[|]
——好吧,真理是和身份,虚假是或身份——x和真是x,x或假是x。这使得all()
必然为真,而any()
必然为假
从一个完全不同的(但实际的)角度来看,any
是一个闩锁,它从false开始,在看到true时变为trueall
是一个锁存器,它从true开始,在看到错误时变为false。不给他们争论意味着不给他们改变状态的机会,所以你只是问他们“默认”状态是什么 any
和all
在python中与其他地方具有相同的含义:
如果至少有一个为真,则任何
均为真
- 如果至少有一个不正确,
all
不正确
我认为all([])==True
通常更难理解,因此下面是一组我认为行为显然是正确的示例:
- 如果电影中的所有对话都有字幕,那么电影适合重听人观看。没有对白的电影仍然适合重听者
- 当室内所有的灯都熄灭时,没有窗户的房间是黑暗的。当里面没有灯光时,它是黑暗的
- 当你所有的液体都装在100毫升的瓶子里时,你可以通过机场安检。如果你没有液体,你仍然可以通过安全检查
- 如果袋子中的所有物品都比插槽窄,则可以通过窄插槽装入软袋。如果袋子是空的,它仍然可以穿过插槽
- 当任务的所有先决条件都满足时,任务就可以开始了。如果任务没有先决条件,则可以开始
这实际上更像是一个注释,但注释中的代码工作得不太好
除了说明为什么
any()
和all()
这样工作的其他逻辑基础外,它们必须有相反的“基本”情况,以便这种关系成立:
all(x for x in iterable) == not any(not x for x in iterable)
如果iterable
的长度为零,则上述值仍应为真。所以
all(x for x in []) == not any(not x for x in [])
这相当于
all([]) == not any([])
如果任何([])
都是真实的,那将是非常令人惊讶的。官方原因尚不清楚,但从文件(证实@John La Rooy的帖子):
def all(iterable):
for element in iterable:
if not element:
return False
return True
def any(iterable):
for element in iterable:
if element:
return True
return False