2016-12-30 77 views
0
var = 86 
print((var<90) & (var>=80)) 

這給真正Python中位運算符 '&' 操作

print(var<90 & var>=80) 
print(var<90 & (var>=80)) 
print((var<90) & var>=80) 
print(var<90 & True) 

`

爲什麼所有這些給假?

+3

你爲什麼試圖使用按位運算符來執行布爾運算? –

+0

嘗試用'和'替換'&';你在做什麼並不合情理。 – 101

+0

我知道我想使用'和'運算符。我只是想知道爲什麼這些是假的。 @ IgnacioVazquez-Abrams –

回答

1

正是由於Operator precedence

print(var<90 & True)爲例,

print(var<90 & True)相當於print(var < (90 & True)),因此它賦予假。

但是,如果將括號放在正確的地方,即print((var<90) & True),那麼它會給出True。

+0

哪個運算符會先執行? – dsgdfg

+0

本文檔不包含任何'優先級'定義。我問'a >> b&c < e dsgdfg

+1

@dsgdfg在文檔中,它說:「下表總結了Python中的運算符優先級,從最低優先級(最少綁定)到最高優先級(大多數綁定),同一個框中的運算符具有相同的優先級。 –

0

位運算符&的優先級高於比較運算符,因此首先對90 & var進行評估,然後進行鏈接比較。

>>> var = 86 
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80 
False 
>>> var<(90 & var)>=80 # same as above 
False 
>>> (var<90) & (var>=80) 
True 
3

您應該使用and運算符代替布爾操作。

由於Python支持鏈接關係運算符(即你可以使用0 < var < 100代替0 < var and var < 100)和處理的二進制運算(即加,減,逐位操作等)關係運算符由於運算符優先級,所有失敗的你發佈的案例實際上意味着別的東西

  1. var < 90 & var >= 80相當於(var < 90 & var) and (90 & var >= 80)
  2. var < 90 & (var>=80)相當於var < 90 & True針對看看第四情況。
  3. (var<90) & var>=80也類似於第四種情況(這解析爲True & var >= 80然後將解析爲0 >= 80)。
  4. var < 90 & True相當於var < (90 & True)&運算符的實現旨在返回0,如果其中一個操作數不是整數(這是動態類型的另一個最大缺陷),這就是爲什麼所有這些類似語句都解析爲var < 0這是錯誤的原因。