"while 1"和"while True"之间有什么区别?

Sri*_*thy 23 python infinite-loop while-loop

我已经看到了两种在Python中创建无限循环的方法:

  1. while 1:
        do_something()
    
    Run Code Online (Sandbox Code Playgroud)
  2. while True:
        do_something()
    
    Run Code Online (Sandbox Code Playgroud)

这些之间有什么区别吗?比另一个更pythonic?

gz.*_*gz. 45

从根本上说它没关系,这种细节并不会真正影响某些东西是否是"pythonic".

如果你对琐事感兴趣,那就有一些不同之处.

  1. Python 2.3之前,内置布尔类型不存在,因此打算在古代版本上运行的代码倾向于使用该while 1:表单.例如,您将在标准库中看到它.

  2. True和False内置函数不是Python 3之前的保留字,因此可以分配给它们,改变它们的值.这有助于上面的情况,因为代码可以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
    
    Run Code Online (Sandbox Code Playgroud)

所以,while True:它更容易阅读,并且while 1:对旧版本的Python有点好处.由于您现在不太可能需要在Python 2.2上运行,或者需要担心循环的字节码计数,因此前者略微优先.

  • 我想指出的是,*以我的拙见*,做某事最Pythonic的方式就是不要担心这样的细节。虽然这篇文章绝对有趣且内容丰富,而且我确实很欣赏这一点,但我坚持这样的说法:“while True:”更具Python风格。至少在我解释奇怪的术语 *pythonic* 的方式中,您的里程可能会有所不同。 (2认同)

por*_*uod 10

最pythonic方式永远是最可读的方式.使用while True:

  • @nomemory:问题是关于"Pythonic" - 与C程序员几乎没有任何关系.如果您想要C程序员可读的内容,请使用C. (8认同)
  • @ S.Lott:我想说的是可读性是非常相对的. (3认同)
  • 对于C程序员来说,最可读的是1 :. (2认同)

Mik*_*ham 5

这并不重要.虽然我个人总是使用while True,但它更难以阅读或理解.

更一般地说,人们用Python编写的大量while-break循环可能是其他东西.有时候我会看到人们写作i = 0; while True: i += 1 ...,可以在for i in itertools.count()while True: foo = fun() if foo is None: break这篇文章的时候用人们写作,这可能for foo in iter(fun, None)需要学习,但需要更少的样板和机会来犯愚蠢的错误.