对这个关于 perl 中的无限循环的问题很感兴趣: while (1) Vs. for (;;) 有速度差异吗? ,我决定在 python 中运行类似的比较。我预计编译器会为 while(True): pass
和 while(1): pass
生成相同的字节码,但实际上在 python2.7 中并非如此。
以下脚本:
import dis
def while_one():
while 1:
pass
def while_true():
while True:
pass
print("while 1")
print("----------------------------")
dis.dis(while_one)
print("while True")
print("----------------------------")
dis.dis(while_true)
产生以下结果:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 12 (to 15)
>> 3 LOAD_GLOBAL 0 (True)
6 JUMP_IF_FALSE 4 (to 13)
9 POP_TOP
9 10 JUMP_ABSOLUTE 3
>> 13 POP_TOP
14 POP_BLOCK
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
使用 while True
明显更复杂。为什么是这样?
在其他情况下,python 就像 True
等于 1:
>>> True == 1
True
>>> True + True
2
为什么 while
区分这两者?
我注意到 python3 确实使用相同的操作评估语句:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 3 (to 6)
9 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
python3 对布尔值的评估方式有变化吗?
原文由 AndrewF 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Python 2.x 中,
True
不是关键字,而只是在bool
类型中定义为 1 的 内置全局常量。因此,解释器仍然必须加载True
的内容。换句话说,True
是可重新分配的:在 Python 3.x 中,它真正成为一个关键字 和一个真正的常量:
因此,解释器可以用无限循环替换
while True:
循环。