【问题标题】:What does the following infinite loop do?下面的无限循环是做什么的?
【发布时间】:2014-01-29 13:38:30
【问题描述】:
while 1:1

以上代码的输出是什么?有什么方法可以检查上面的循环是在做某事还是什么都不做?一种方法是在 while 循环体中输入 print 语句,例如:

while 1:
  1
  print "2"

但是,如果在 while 循环体中不输入任何新内容,我们是否可以检查循环是否至少在做某事?

【问题讨论】:

  • “做某事”是什么意思?只要程序不退出,就很明显它在做something:循环。您还在寻找什么其他类型的操作?
  • 也许你可以看看任务管理器,看看资源去进程?显然,如果您允许编写的唯一代码是 while 1:1,您将需要查看 IDLE Gui 或 python 输出以外的其他地方。

标签: python infinite-loop


【解决方案1】:

你可以这样检查:

>>> def f():
...   while True: 42
... 
>>> 
>>> import dis
>>> dis.dis(f)
  2           0 SETUP_LOOP              10 (to 13)
        >>    3 LOAD_GLOBAL              0 (True)
              6 POP_JUMP_IF_FALSE       12
              9 JUMP_ABSOLUTE            3
        >>   12 POP_BLOCK           
        >>   13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        
>>> 

所以你可以看到,它除了循环之外什么都不做。

说实话,我很惊讶它甚至没有在某处加载给定值。

【讨论】:

  • 我想加载一个不可变的全局然后不在任何地方存储它是一件容易优化的事情......
  • 这很有趣,尤其是在阅读了question 之后。使用变量名,它们被压入堆栈并立即弹出。
  • 您对循环的每次迭代的输出有何看法?是“无”吗?
  • @Codingman 如果我执行print,它将打印出来。但除此之外,除非我处于交互会话的顶层,否则它确实不会。
  • @glglgl -- 我想如果你看dis.dis 的输出足够多,你会发现它确实优化了一些 东西,只是没有那么多:)。跨度>
【解决方案2】:

您似乎在某种误解下工作。我不知道我对你的解释是否正确,但在正常情况下,你编写的程序甚至没有不“做某事”的选项:它不断执行指令是计算机的一个基本方面.

真正让计算机“不做任何事情”的唯一方法是在硬件级别进行编程,在那里你可以告诉 CPU 停止,但在正常架构上,只有内核才能访问此类特权指令,而 Python 等高级编程语言不会公开它们。

为了在用户程序级别不做任何事情,您可以做的就是要求内核不要调度您的进程,例如通过执行对 sleep 的调用或阻塞 I/O打电话之类的。但是,由于您没有明确地执行任何此类操作,因此您的程序除了执行之外别无选择。要求“验证”它是否在做某事就像要求验证 1 + 1 = 2:根据定义,它就是真的。

【讨论】:

    【解决方案3】:

    循环肯定在做某事,尽管可以说没有什么用处。如果您在交互式 shell 中,则输出是无穷无尽的 1s 流。在脚本中,不会有输出。

    在 python 中,1 的计算结果为True,因此while 循环类似于while True:

    试试这个:

    print "While loop starting!"
    while 1:1
    print "While loop has finished!"
    

    你会发现第二行永远不会打印。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2014-02-06
      • 2020-01-13
      相关资源
      最近更新 更多