运行下面的代码
print(print('1') or print('2') and print('3') or print('4'))
将导致:
1
2
4
None
我知道优先级是
not
> and
> or
,所以我预料到了
2
1
4
None
我不明白这个结果。请解释一下。
我们必须理解多个概念。
在Python中
print
是一个函数,作为所有函数它都必须返回一些东西,它是None
Python 中的任何值都可以解释为布尔值。如:
空字符串是
Falsy
,所以会被认为是False
。任何其他字符串(无空)都是 Truthy
并被视为 True
None
是 Falsy
所以它被认为是 False
。
0
是 Falsy
,任何其他(负面事件)都是 Truthy
。
等等...
Python 试图通过逻辑比较变得聪明。
如果 or 的第一个组件是
Truthy
,Python 将停止寻找比较的其他组件。
例如,Python 不会检查下一个示例中的
value2
,因为 value1
是 True
value1 = True
value2 = False
if value1 or value2:
pass
如果 or 的第一个组件是
Falsy
,Python 将停止寻找比较的其他组件。
例如,Python 不会检查下一个示例中的
value2
,因为 value1
是 False
value1 = False
value2 = True
if value1 or value2:
pass
有了所有这些知识:
print(print('1') or print('2') and print('3') or print('4'))
将被视为:
comp1 = print('1') or print('2')
comp2 = print('3') or print('4')
comp3 = comp1 and comp2
因为有一个
or
并且print
正在返回None
,即Falsy
,python将执行两边以查看是否有任何Truthy
。最后comp1
将是Falsy
与
comp1
相同。 comp2
将是 Falsy
最后有一个
and
。第一部分是 Falsy
a,第二部分不会被检查。
最后,第一个打印将是
print
None
,因为值不是 boolean
和 Falsy
None
。
检查:
print(1 or 0)
考虑到运算符的优先级以及 print() 函数的行为方式,我们已经逐步分解了提供的 Python 代码:
print(print('1') or print('2') and print('3') or print('4'))
结果
打印('1')
为 None,因为 print() 始终返回 None。 表达式如下:
None or **print('2')** and **print('3')** or **print('4')**
表达式变为:
None and print('3')
现在我们有:
None or None or print('4')
最终操作:print('4')
最终输出:
1
2
4
None