2017-02-19 42 views
1

我做一個分配編譯帕斯卡爾的一個子集,並在最初的方案還有的像這樣的代碼行:爲什麼下面的代碼返回True?

if x.tp == y.tp in {Bool, Int}: 
    some other code ... 

這讓我真的很困惑,x.tp == y.tp返回一個布爾值TrueFalse,因此True/False in {Bool, Int}將始終返回False

BoolInt的定義如下:

class Int: pass 

class Bool: pass 

然後,我將在該行斷點,並在VSCode的調試器玩耍:

>> x.tp 
<class 'ST.Int'> 
>> y.tp 
<class 'ST.Int'> 
>> x.tp == y.tp 
True 
>> a = (x.tp == y.tp) 
None 
>> a 
True 
>> a in {Bool, Int} 
False 
>> x.tp == y.tp in {Bool, Int} 
True  <----------------------- why does it return True? 

爲什麼x.tp == y.tp in {Bool, Int}回報True這裏?

+0

什麼是'x.tp'和'y.tp'? –

+0

@ JimFasarakis-Hilliard'x.tp'和'y.tp'都是這兩種類型。我不確定是否應該發佈更多的代碼,因爲它太長 –

回答

4

使用括號來分組相等比較:

if (x.tp == y.tp) in {Bool, Int}: 

鏈比較得到由Python的評價爲:

if x.tp == y.tp and y.tp in {Bool, Int}: 

這將產生True因爲y.tp是類<class 'ST.Int'>和實際上在臨屋區t集。

Reference Manual on Comparisons

比較可以任意鏈的,例如,x < y <= z相當於x < y and y <= z,不同之處在於y只計算一次(但在這兩種情況下z不評估在所有時x < y被發現爲False)。

+0

這應該不重要,因爲它具有相同的優先級,它將從左到右評估是不是? –

+0

@Jackddddd == ==得到了評估,'{bool,Int}中的y.tp也得到了評估(因爲相等是'True')並且使整個事情成爲'True',這就是Python如何處理鏈式比較。 –

0

當然,我們假設這行代碼

if x.tp == y.tp in {Bool, Int}: 

應該工作(或解析)的,如:

if (x.tp == y.tp) in {Bool, Int}: 

但這的情況。據this article,解析,然後比較做過這樣:

if (x.tp == y.tp) and (y.tp in {Bool, Int}) : 

有一些混亂,因爲沒有被明確的事情。請儘量避免代碼維護人員受益的類似情況。

來源:Python comparison operators chaining

+0

如果您在{bool}中設置爲True,您將得到False。 – Nf4r

+0

返回False –

+1

@Jackddddd更新瞭解釋! – kmario23

相關問題