Python布尔表达式为何不“短路”?

10 投票
2 回答
2343 浏览
提问于 2025-04-16 07:45

比如说:

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

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

foo
bar

而不是:

foo
foo
foo
bar

为什么会这样呢?我该怎么才能实现“短路”效果呢?

2 个回答

5

它是在传递给任何东西之前先创建列表。

尝试一下

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

这样做的话,只会创建一个生成器表达式,所以只会计算出需要的项数。

18

把你的程序拆开来看看发生了什么:

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

你已经创建了一个列表,并且用它调用了any函数,还打印了3次。

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

这个列表被用在了if语句里:

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

解决办法:把一个生成器传给any函数。

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

撰写回答