python“或”运算符的奇怪行为

2024-10-01 15:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,守则:

>>> False or 'hello'
'hello'

这种令人惊讶的行为使您可以检查x!=无并检查一行中的x值:

>>> x = 10 if randint(0,2)==1 else None
>>> (x or 0) > 0
depend on x value...

说明:“or”函数如下:(link) 如果x为假,则为y,否则为x

我所知道的任何语言都不允许你这么做。 那么,为什么Python会这样做呢


Tags: or函数none语言falsehelloifvalue
3条回答

听起来你好像把两个问题结合在一起了

首先是短路问题。Marcin的回答完美地解决了这个问题,所以我不会做得更好

其次,orand返回最后一个计算值,而不是将其转换为bool。这两种观点都有争议,你可以在分歧的两边找到许多语言

返回最后一个计算值可以使用functionCall(x) or defaultValue快捷方式,避免可能浪费的转换(如果您要用它做的唯一事情是检查它是否为非零,那么为什么要将int{}转换为bool{}),并且通常更容易解释。因此,由于这些原因的各种组合,像C、Lisp、Javascript、Lua、Perl、Ruby和VB这样的语言都是这样做的,Python也是如此

始终从运算符返回布尔值有助于捕获某些错误(特别是在逻辑运算符和按位运算符容易混淆的语言中),并且它允许您设计一种语言,其中布尔检查是针对true的严格类型检查,而不仅仅是针对非零的检查,它使运算符的类型更容易写出,并且避免了在两个操作数是不同类型的情况下进行转换(请参见C族语言中的?:运算符)。因此,对于这些原因的各种组合,诸如C++、FORTRAN、SMALLATE和HASKELL这样的语言都是这样做的。p>


在您的问题中(如果我理解正确),您使用此功能可以编写如下内容:

if (x or 0) < 1:

x可以很容易地None时。这个特定的用例不是很有用,因为更显式的x if x else 0(在Python2.5和更高版本中)同样容易编写并且可能更容易理解(至少Guido这么认为),但也因为None < 10 < 1相同(至少在Python2.x中,所以您总是至少有两个选项中的一个)…但也有类似的例子,它有用的。比较这两个:

return launchMissiles() or -1

return launchMissiles() if launchMissiles() else -1

第二种方法将浪费大量导弹,两次而不是一次炸毁你在南极洲的敌人


如果您想知道Python为什么会这样做:

回到1.x天,有bool型。你有像None0[]()""等错误的值,其他的都是真的,那么谁需要显式的FalseTrue?从or返回1是愚蠢的,因为1并不比[1, 2, 3]"dsfsdf"更正确。当bool被添加时(逐渐超过两个2.x版本,IIRC),当前的逻辑已经牢固地嵌入到语言中,更改会破坏很多代码

那么,为什么他们没有在3.0中更改它呢?许多Python用户,包括BDFL Guido,都会建议在这种情况下不要使用or(至少因为它违反了“TOOWTDI”);您应该将表达式的结果存储在变量中,例如:

missiles = launchMissiles()
return missiles if missiles else -1

事实上,Guido说他想禁止launchMissiles() or -1,这也是他最终接受三元if-else表达式的部分原因,他以前多次拒绝过这个表达式。但许多其他人不同意,Guido是一个仁慈的DFL。此外,让or以您在其他地方期望的方式工作,同时拒绝在这里做您想做的事情(但Guido不想让您做)实际上是相当复杂的


因此,Python在这里可能永远与C、Perl和Lisp站在同一边,而不是与Java、Smalltalk和Haskell站在同一边

事实上,很多语言都有。参见维基百科关于Short-Circuit Evaluation

关于短路评估存在的原因,维基百科写道:

If both expressions used as conditions are simple boolean variables, it can be actually faster to evaluate both conditions used in boolean operation at once, as it always requires a single calculation cycle, as opposed to one or two cycles used in short-circuit evaluation (depending on the value of the first).

No language that i know lets you do this. So, why Python do?

那你不懂很多语言。我想不出一种我所知道的语言不表现出这种“短路”行为

之所以这样做,是因为这样说很有用:

a = b or K

这样,如果b不是None(或falsy),则a变成b,如果不是,则获得默认值K

相关问题 更多 >

    热门问题