我有这样的代码:解释字符串布尔测试结果
>>> 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'在不让你做你不应该做的事情方面一样好或者更好。 –