逻辑AND(python)的评估顺序

时间:2017-03-03 11:45:53

标签: python logical-operators

在python中,效率更高:

if a:
    if b:
        # do something

if a and b:
    # do something

如果b为false时未计算a,则后者效率会更高。但我似乎无法确定Python文档中是否存在这种情况。也许有人可以指点我吗?

3 个答案:

答案 0 :(得分:2)

短路

如果Y为false,Python不会在X and Y中运行X。你可以自己尝试一下:

if True and print("Hello1"):
    pass

if False and print("Hello2"):
    pass # "Hello2" won't be printed

Python做到这一点的原因是它有一种称为短路的东西,可以优化像这样的逻辑表达式。 Python意识到如果X为假,那么检查Y是没有意义的,因为无论如何整个表达式都是假的。

如何避免短路

您可以使用逻辑运算符的按位版本在Python中绕过它:

and -> & 
or -> |

例如:

if True & bool(print("Hello1")):
    pass

if False & bool(print("Hello2")):
    pass # "Hello2" will be printed this time

但请注意,您需要在print中包含bool,因为按位仅适用于相同的数据类型。

效果

我认为性能明智只有一个if语句会更快,因为如果它发现条件为真,其他明智的python可能必须通过2个if语句。

答案 1 :(得分:1)

这称为短路,is mentioned in the docs

答案是,如果a为False,Python将不会评估b。

答案 2 :(得分:0)

它从左到右进行评估,简单实验

def iftrue1():
    print("iftrue1")
    return True

def iftrue2():
    print("iftrue2")
    return True

if iftrue1() and iftrue2():
    pass

此输出

iftrue1
iftrue2