我有这个代码:
>>> 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
工作的详细信息,请参阅python 文档的“布尔运算”部分:
表达式 x 或 y 首先计算 x;如果 x 为真,则返回其值;否则,评估 y 并返回结果值。
上面描述的排序很关键,包括一个叫做“惰性求值”的概念。
您正在进行的比较实际上比较了'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