3

私はこのコードを持っています:

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

なぜこれは等しくないのTrueですか?

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

3 に答える 3

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
于 2012-10-27T20:56:29.760 に答える
3

違いは、これらの式の評価方法です。

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

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

char...したがって、あなたの場合、「B」または「A」は等しくないはずです。

動作方法の詳細については、python docs の「ブール演算」セクションをor参照してください。

式 x または y は最初に x を評価します。x が true の場合、その値が返されます。それ以外の場合、y が評価され、結果の値が返されます。

上記の順序付けは重要であり、「遅延評価」と呼ばれる概念が含まれています。

于 2012-10-27T20:52:29.520 に答える
2

あなたが行っている比較は、実際には と のブール値を比較し'A'ます'B'

so :('A' or 'B')実際(bool('A') or bool('B')には です。これはor条件でありbool('A')True最初のケースではそのままなので比較'A'==charし、2 番目のケースで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        
于 2012-10-27T21:03:21.867 に答える