Python-当第一个值为False时,评估复合if语句

时间:2013-11-18 10:42:16

标签: python if-statement

我在一个带有几个部分的if语句中遇到了奇怪的行为,我根本无法弄清楚发生了什么,虽然很明显我错过了至少python认为很明显的东西。

这是我的语法:

if not(boolean) & (fogXLeft < float(cols[xCol])) < fogXRight) & (fogYBot < float(cols[yCol]) < fogYTop): 
    print "boolean: " + str(boolean)
    boolean = True

问题在于,即使布尔值设置为True(因此不是(布尔值)为False),每次都会输入if语句。 (我知道因为“boolean:True”被反复打印出来。)然而,当我评论出结束部分时,所以它只是基于bool评估:

if not(boolean): # & (fogXLeft < float(cols[xCol]) < fogXRight) & (fogYBot < float(cols[yCol]) < fogYTop):
    print "boolean: " + str(boolean)
    boolean = True

然后只输入一次if语句(因为从那时起布尔值设置为True)。

我认为问题可能与复合比较有关(尽管我知道这是合法的语法),但这也会在每次迭代时输入if语句:

if not(boolean) & (fogXLeft < float(cols[xCol])): #< fogXRight) & (fogYBot < float(cols[yCol]) < fogYTop):  
    print "boolean: " + str(boolean)
    boolean = True

我在这里缺少什么?我很沮丧。

感谢。

2 个答案:

答案 0 :(得分:4)

&是一个按位运算符,而不是and运算符。而是使用and逻辑运算符,而不是按位运算符。

答案 1 :(得分:1)

not是一个运算符,而不是一个函数。 &是一个优先级高于not的运营商。

所以:

if not(boolean) & (fogXLeft < float(cols[xCol])) < fogXRight) & (fogYBot < float(cols[yCol]) < fogYTop):

相当于:

if not ((boolean) & (fogXLeft < float(cols[xCol])) < fogXRight) & (fogYBot < float(cols[yCol]) < fogYTop)):

反过来,如果booleanTrue,则等同于:

if not (1 & (fogXLeft < float(cols[xCol])) < fogXRight) & (fogYBot < float(cols[yCol])  < fogYTop)):

如果其他两个比较中的任何一个失败,则为真。