python布尔表达式不是“短路”? [重复]

问题描述 投票:0回答:2

例如:

def foo():
    print 'foo'
    return 1
if any([f() for f in [foo]*3]):
   print 'bar'

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

foo
bar

而不是:

foo
foo
foo
bar

为什么?如何才能做出“短路”效果?

python short-circuiting
2个回答
18
投票

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

>>> [f() for f in [foo]*3]
foo
foo
foo
[1, 1, 1]
>>> 

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

>>> any ([1, 1, 1])
True

这被馈送到 if 语句:

>>> if any([1, 1, 1]):
...     print 'bar'
... 
bar
>>> 

解决方案:将生成器传递给任何

>>> (f() for f in [foo]*3)
<generator object <genexpr> at 0x10041a9b0>

5
投票

它在将列表传递给任何人之前创建列表

尝试

def foo():
    print 'foo'
    return 1
if any(f() for f in [foo]*3):
   print 'bar'

这样,仅创建生成器表达式,因此仅计算所需数量的项。

© www.soinside.com 2019 - 2024. All rights reserved.