Python是否懒惰地评估条件是否存在?

oga*_*ma8 60 python lazy-evaluation

例如,如果我有以下声明:

if( foo1 or foo2)
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

如果foo1为true,python会检查foo2的条件吗?

unu*_*tbu 76

是的,Python懒惰地评估布尔条件.

文件说,

表达式x和y首先计算x; 如果x为false,则返回其值; 否则,将评估y并返回结果值.

表达式x或y首先评估x; 如果x为真,则返回其值; 否则,将评估y并返回结果值.

  • 我要指出的是,还可以进行按位比较,这并不懒惰,例如下面的[Eric Wang的答案](/sf/answers/2613967051/)。您还可以签出[documentation](https://docs.python.org/2/reference/expressions.html#binary-bitwise-operations)。 (2认同)

小智 29

and or 很懒

& | 不是懒惰


小智 11

Python的懒惰可以通过以下代码证明:

def foo():
    print('foo')
    return False

def bar():
    print('bar')
    return False

foo() and bar()         #Only 'foo' is printed
Run Code Online (Sandbox Code Playgroud)

另一方面,

foo() or bar()
Run Code Online (Sandbox Code Playgroud)

会导致打印'foo'和'bar'.


Pet*_*ppi 6

这在技术上不是懒惰的评估,它是短路布尔表达式.

懒惰的评价有一些不同的含义.例如,真正的懒惰评估可能会允许这样做

def foo(arg) :
    print "Couldn't care less"

foo([][0])
Run Code Online (Sandbox Code Playgroud)

但Python没有.

Python也很好,因为它"回声"它是布尔参数.例如,一个或条件返回它的第一个"truthy"参数或最后一个参数(如果所有参数都是"falsey").和条件相反.

所以"回声论证"布尔意味着

2和[]和1

评估为[],和

[]或1或2

评估为1

  • 惰性评估是一个笼统的术语,也可以指逻辑运算符的短路行为。如果您指的是按需呼叫,则通常将其称为“按需呼叫”,因为懒惰的评估可能意味着太多。 (2认同)
  • @PeteIsNeat如果你想成为技术规范主义者,"懒惰评估"是*实现*按需调用语义的众多方法之一.它们不是同义词,也不是等同词.我是一个描述主义者所以当人们谈论"懒惰的行为"时,从上下文来看,他们谈论的是短路,我并不介意.:) (2认同)