私はこのコードを持っています:
>>> char = 'A'
>>> 'A' == char
True
>>> ('A' or 'B') == char
True
なぜこれは等しくないのTrue
ですか?
>>> ('B' or 'A') == char
False
私はこのコードを持っています:
>>> char = 'A'
>>> 'A' == char
True
>>> ('A' or 'B') == char
True
なぜこれは等しくないのTrue
ですか?
>>> ('B' or 'A') == char
False
あなたの表現はあなたが期待することをしていません。
'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
違いは、これらの式の評価方法です。
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 が評価され、結果の値が返されます。
上記の順序付けは重要であり、「遅延評価」と呼ばれる概念が含まれています。
あなたが行っている比較は、実際には と のブール値を比較し'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