为何Python中使用or运算符时左右两个表达式都会被执行?
为什么Python中用or连接的两个print语句都会执行?
我编写了如下代码:
def func(i): a = i + 1 (a % 15 == 0 and print(f"{a} AB")) or print(a) i < 15 and func(a) func(0)
运行后输出为:
1 2 ... 14 15 AB 15 16
我无法理解,为何使用or连接(a % 15 == 0 and print(f"{a} AB"))和print(a)这两个语句时,两者都会被执行。请问原因是什么?
P.S:补充说明,这只是练习代码,绝不会用于生产环境。
问题解析
核心原因在于Python逻辑运算符的短路求值规则,以及print()函数的返回值特性:
print()函数执行后会返回None,而None在布尔语境下会被判定为False。- 当
a=15时:- 先执行左边表达式
(a % 15 == 0 and print(f"{a} AB")):因为a%15==0是True,短路求值会继续执行print("15 AB"),这个print输出内容后返回None,所以整个左边表达式的结果是None(布尔值为False)。 - 接着执行
None or print(a):由于左边是False,or运算符的短路规则会触发右边的表达式,所以print(a)被执行,输出15。
- 先执行左边表达式
- 而当
a≠15时,左边表达式(a%15==0 and ...)会直接返回False,or触发右边的print(a),只会输出一次数值,符合预期。
另外输出里的16来自递归调用:当i=14时,执行完那行代码后,i<15为True,会递归调用func(15),此时a=16,左边表达式不成立,只执行右边的print(16)。
内容的提问来源于stack exchange,提问作者Georgi Georgiev
相关产品推荐
相关产品推荐

