Python - 短路奇怪的行为
Python - Shortcircuiting strange behaviour
在以下代码片段中,函数 f
按预期执行:
def f():
print('hi')
f() and False
#Output: 'hi'
但在下面类似的代码片段中 a
不会递增:
a=0
a+=1 and False
a
#Output: 0
但是如果我们用 True 而不是 False 短路 a
会增加:
a=0
a+=1 and True
a
#Output: 1
这种短路是如何工作的运行?
我相信
a+=1 and False
相当于
a+=(1 and False)
和
a+=1 and True
相当于
a+=(1 and True)
例如:
In [15]: a = 0
In [16]: a+=2 and True
In [17]: a
Out[17]: 1
那是因为 f() and False
是一个表达式(从技术上讲是一个单表达式语句),而 a += 1 and False
是一个赋值语句。它实际上解析为 a += (1 and False)
,并且由于 1 and False
等于 False
并且 False
实际上是整数 0,所以发生的是 a += 0
,一个无操作。
然而,(1 and True)
的计算结果为 True
(即整数 1),因此 a += 1 and True
表示 a += 1
。
(还要注意 Python 的 and
和 or
总是 return 它们的第一个可以明确确定运算结果的操作数)
在以下代码片段中,函数 f
按预期执行:
def f():
print('hi')
f() and False
#Output: 'hi'
但在下面类似的代码片段中 a
不会递增:
a=0
a+=1 and False
a
#Output: 0
但是如果我们用 True 而不是 False 短路 a
会增加:
a=0
a+=1 and True
a
#Output: 1
这种短路是如何工作的运行?
我相信
a+=1 and False
相当于
a+=(1 and False)
和
a+=1 and True
相当于
a+=(1 and True)
例如:
In [15]: a = 0
In [16]: a+=2 and True
In [17]: a
Out[17]: 1
那是因为 f() and False
是一个表达式(从技术上讲是一个单表达式语句),而 a += 1 and False
是一个赋值语句。它实际上解析为 a += (1 and False)
,并且由于 1 and False
等于 False
并且 False
实际上是整数 0,所以发生的是 a += 0
,一个无操作。
(1 and True)
的计算结果为 True
(即整数 1),因此 a += 1 and True
表示 a += 1
。
(还要注意 Python 的 and
和 or
总是 return 它们的第一个可以明确确定运算结果的操作数)