2012-10-27 54 views

回答

6

你的表情不符合你的期望。

'A' or 'B' 

這實際上評估爲'A',嘗試一下在解釋!

當你說

('A' or 'B') == char 

的解釋其實就是做下列步驟操作:

('A' or 'B') == char 
('A') == char 
True 

但是當你做

('B' or 'A') == char 

的解釋做這個的:

('B' or 'A') == char 
('B') == char 
False 

什麼你可能想要的是:

'A' == char or 'B' == char 
True 
+6

還是在( 'A', 'B')''字符。 – nneonneo

+0

謝謝,但我覺得它非常直觀。爲什麼('A'或'B')== char選項在這種情況下甚至是允許的? – minerals

+0

因爲這是一個合法的比較。我想你會發現'python'在不讓你做你不應該做的事情方面一樣好或者更好。 –

3

所不同的是這些表達式如何評價:

In [1]: 'A' or 'B' 
Out[1]: 'A' 

In [3]: 'B' or 'A' 
Out[3]: 'B' 

......因此, 'B' 或 'A' 應該在你的情況下,不等於char

要詳細瞭解or應該如何工作,請參考"Boolean operations" section of the python docs

表達式x或y首先評估X;如果x爲真,則返回其值;否則,評估y並返回結果值。

上述排序很關鍵,並且包含一個名爲「lazy evaluation」的概念。

2

你實際上在做的比較比較的'A''B'布爾值。

這樣:('A' or 'B')實際上是(bool('A') or bool('B'),因爲它是一個or條件和bool('A')True在第一種情況下,因此比較'A'==char,並且在第二情況下爲bool('B')爲True所以它比較'B'==char(這是False

In [114]: False or True 
Out[114]: True 

In [115]: True or False 
Out[115]: True 

In [116]: True or True 
Out[116]: True 

In [117]: bool('A') 
Out[117]: True 

In [118]: bool('B') 
Out[118]: True 

這是它在後臺是如何發生的:\

In [104]: def func(): 
    char="A" 
    return ('A' or 'B')==char 
    .....: 

In [107]: def func1(): 
    char="A" 
    return ("B" or "A")==char 
    .....: 

In [110]: dis.dis(func) 
    2   0 LOAD_CONST    1 ('A') 
       3 STORE_FAST    0 (char) 

    3   6 LOAD_CONST    1 ('A') #loads 'A' 
       9 JUMP_IF_TRUE    4 (to 16) # if 'A' is True then go to 16 
                # As 'A' is not a falsy value so it                           
                goes to 16 
      12 POP_TOP     
      13 LOAD_CONST    2 ('B') 
     >> 16 LOAD_FAST    0 (char) #load char , i.e 'A' 
      19 COMPARE_OP    2 (==) #compare 'A'=='A' , i,e True 
      22 RETURN_VALUE   

In [111]: dis.dis(func1) 
    2   0 LOAD_CONST    1 ('A') 
       3 STORE_FAST    0 (char) 

    3   6 LOAD_CONST    2 ('B')  #load 'B', it's a true value 
                 # so go to 16 
       9 JUMP_IF_TRUE    4 (to 16) 
      12 POP_TOP    
      13 LOAD_CONST    1 ('A') 
     >> 16 LOAD_FAST    0 (char)  #load chr ,i.e 'A' 
      19 COMPARE_OP    2 (==)  #'B'=='A' , False 
      22 RETURN_VALUE   
+0

謝謝,我明白了.. – minerals