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: