python布尔表达式不是"短路"?

Joh*_*ang 10 python short-circuiting

例如:

def foo():
    print 'foo'
    return 1
if any([f() for f in [foo]*3]):
   print 'bar'
Run Code Online (Sandbox Code Playgroud)

我认为上面的代码应该输出:

foo
bar
Run Code Online (Sandbox Code Playgroud)

代替 :

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

为什么?我怎样才能产生"短路"效应?

pyf*_*unc 18

解构您的程序,看看发生了什么:

>>> [f() for f in [foo]*3]
foo
foo
foo
[1, 1, 1]
>>> 
Run Code Online (Sandbox Code Playgroud)

您已经创建了一个列表并传递给任何列表并打印了3次.

>>> any ([1, 1, 1])
True
Run Code Online (Sandbox Code Playgroud)

这被送到if语句:

>>> if any([1, 1, 1]):
...     print 'bar'
... 
bar
>>> 
Run Code Online (Sandbox Code Playgroud)

解决方案:将发电机通过任何发电机

>>> (f() for f in [foo]*3)
<generator object <genexpr> at 0x10041a9b0>
Run Code Online (Sandbox Code Playgroud)


Bwm*_*mat 5

它正在创建列表,然后再将其传递给任何

尝试

def foo():
    print 'foo'
    return 1
if any(f() for f in [foo]*3):
   print 'bar'
Run Code Online (Sandbox Code Playgroud)

通过这种方式,仅创建生成器表达式,因此仅评估所需数量的项。