例如:
def foo():
print 'foo'
return 1
if any([f() for f in [foo]*3]):
print 'bar'
我认为上面的代码应输出:
foo
bar
而不是:
foo
foo
foo
bar
为什么?怎样才能产生“短路”效应?
答案 0 :(得分:17)
解构你的程序,看看发生了什么:
>>> [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>
答案 1 :(得分:4)
在将列表传递给任何
之前创建列表试
def foo():
print 'foo'
return 1
if any(f() for f in [foo]*3):
print 'bar'
这样只创建了一个生成器表达式,因此只评估了必要的术语。