2012-10-27 32 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