python - "while 1"和 "while True"有什么区别?

标签 python while-loop infinite-loop

我见过两种在 Python 中创建无限循环的方法:

  1. while 1:
        do_something()
    
  2. while True:
        do_something()
    

这些有什么区别吗?一个比另一个更 python ?

最佳答案

基本上没关系,这些细节并不会真正影响某事物是否是“pythonic”。

但是,如果您对琐事感兴趣,则存在一些差异。

  1. builtin boolean type didn't exist till Python 2.3所以打算在古代版本上运行的代码倾向于使用 while 1: 形式。例如,您会在标准库中看到它。

  2. True 和 False 内置命令是 not reserved words prior to Python 3所以可以分配给,改变他们的值(value)。这对上述情况有所帮助,因为代码可以执行 True = 1 以实现向后兼容性,但这意味着每次需要在全局字典中查找名称 True用过。

  3. 由于上述限制,两个版本编译成的字节码在 Python 2 中是不同的,因为对常量整数进行了优化,它不能用于 True。因为 Python 在编译 1 时可以判断它始终为非零,所以它移除了条件跳转并且根本不加载常量:

    >>> import dis
    >>> def while_1():
    ...     while 1:
    ...         pass
    ...
    >>> def while_true():
    ...     while True:
    ...         pass
    ...
    >>> dis.dis(while_1)
      2           0 SETUP_LOOP               5 (to 8)
    
      3     >>    3 JUMP_ABSOLUTE            3
                  6 POP_TOP
                  7 POP_BLOCK
            >>    8 LOAD_CONST               0 (None)
                 11 RETURN_VALUE
    >>> dis.dis(while_true)
      2           0 SETUP_LOOP              12 (to 15)
            >>    3 LOAD_GLOBAL              0 (True)
                  6 JUMP_IF_FALSE            4 (to 13)
                  9 POP_TOP
    
      3          10 JUMP_ABSOLUTE            3
            >>   13 POP_TOP
                 14 POP_BLOCK
            >>   15 LOAD_CONST               0 (None)
                 18 RETURN_VALUE
    

所以,while True: 更容易阅读,而 while 1: 对旧版本的 Python 更友好一些。由于这些天您不太可能需要在 Python 2.2 上运行,或者不需要担心循环的字节码计数,因此前者略胜一筹。

关于python - "while 1"和 "while True"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261987/

相关文章:

python - 如何使用 Twisted 在 SSH 内建立任何 Twisted 协议(protocol)(例如 HTTP)隧道?

python - 使用python从另一个文本文件中的列表打开文本文件

iOS:在 while 循环中使用 block 回调的异步方法

Java - 无法读取包含在 if else 语句中的记录集

java - for 循环如何将文本放入 3 个 JTextArea

arrays - 采用泛型数组的 Swift 函数

python - 使用字典定义计算 pandas 数据框中出现次数的条件

java - java代码无限循环,Scanner对象缓冲区可能是

c# - 通过无限循环生成元素返回 IEnumerable<T> 是否有缺点?

python - pandas 使用 $ 特殊文本样式分割字符串