我有這樣的代碼:解釋字符串布爾測試結果
>>> 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'
......因此, 'B' 或 'A' 應該在你的情況下,不等於char
。
要詳細瞭解or
應該如何工作,請參考"Boolean operations" section of the python docs:
表達式x或y首先評估X;如果x爲真,則返回其值;否則,評估y並返回結果值。
上述排序很關鍵,並且包含一個名爲「lazy evaluation」的概念。
你實際上在做的比較比較的'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
謝謝,我明白了.. – minerals
還是在( 'A', 'B')''字符。 – nneonneo
謝謝,但我覺得它非常直觀。爲什麼('A'或'B')== char選項在這種情況下甚至是允許的? – minerals
因爲這是一個合法的比較。我想你會發現'python'在不讓你做你不應該做的事情方面一樣好或者更好。 –