我在一个带有几个部分的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
我在这里缺少什么?我很沮丧。
感谢。
答案 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)):
反过来,如果boolean
为True
,则等同于:
if not (1 & (fogXLeft < float(cols[xCol])) < fogXRight) & (fogYBot < float(cols[yCol]) < fogYTop)):
如果其他两个比较中的任何一个失败,则为真。