Python 在if语句中引擎盖下发生了什么?

Python 在if语句中引擎盖下发生了什么?,python,Python,在if语句中,发动机罩下发生了什么?例如: list_ = [1, 2, 3] str_ = '' if str_ or list_: # do something 我们能说这样的事情会发生吗 if bool(str_ or list_) is True: # do something 如果你说 a = 0 b = None c = 123 d = 'aaa' zzz = a or b or c or d 然后zzz等于123。所以if对表达式求值并对该答案进行运算。由于

if
语句中,发动机罩下发生了什么?例如:

list_ = [1, 2, 3]
str_ = ''

if str_ or list_:
    # do something
我们能说这样的事情会发生吗

if bool(str_ or list_) is True:
    # do something
如果你说

a = 0
b = None
c = 123
d = 'aaa'
zzz = a or b or c or d
然后
zzz
等于
123
。所以if对表达式求值并对该答案进行运算。由于Python采用非空字符串、列表、非
None
值,而不是零数字,因此整个系统遵循布尔代数

str_ or list_
令人惊讶的是,它既不是真的,也不是假的,它只是简单的

更准确地说,来自:

表达式
x或y
首先计算
x
;如果
x
为真,则返回其值;否则,将计算
y
,并计算结果 返回值

然后,对于
if
语句中的评估:

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下 值被解释为false:
false
None
、所有类型的数字零以及空字符串和容器(包括 字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为true。用户定义对象 可以通过提供
\uu bool\uu()
方法自定义它们的真值


因此,在您的特定情况下,
str\uuu
为空,因此其布尔值被解释为
False
,并且

str_ or list_
将计算为变量
列表的值
,即。E到
[1,2,3]

然后

被解释为

if True:

因为
[1,2,3]
不是空的。

是。它计算真实性,并检查
if
后面的表达式是否为
True
。请注意,
也计算真实性。从语义上讲,它们是相同的,但在每种情况下生成的字节码不同。@cᴏʟᴅsᴘᴇᴇᴅ: 是的,我想这是因为
bool
可以被覆盖,所以Python无法对此进行优化。如果您创建一个自定义类,您可以在Python2中定义
\uuuuu非零\uuuuu
,或者在Python3中定义
\uuuuu bool\uuuuu
来覆盖If语句期间发生的事情。@cᴏʟᴅsᴘᴇᴇᴅ - 这似乎不对<代码>(''或[1,2,3])为真返回
False
。还是我误解了你的评论?
if True: