2014-01-29 5 views
-1
while 1:1 

Каков вывод вышеуказанного кода? Есть ли способ проверить, что вышеуказанный цикл делает что-то или ничего? Один из способов ввести оператор печати в теле цикла в то время как:Что делает следующий бесконечный цикл?

while 1: 
    1 
    print "2" 

Но, не входя ничего нового в теле цикла в то время как мы можем проверить, что цикл по крайней мере, делать что-то?

+1

Что вы подразумеваете под этим «что-то»? Пока программа не выходит, довольно очевидно, что она делает что-то *: цикл. Какие еще действия вы ищете? – Dolda2000

+0

Возможно, вы можете посмотреть на диспетчер задач и посмотреть, какие ресурсы идут в этот процесс? Очевидно, что если только один код, который вы разрешите записать, - 'while 1: 1', вам нужно искать где-то, кроме выхода IDLE Gui или python. – chase

ответ

5

Вы можете проверить, что таким образом:

>>> 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   
>>> 

Таким образом, вы можете видеть, это просто не делает ничего, кроме зацикливание.

Я удивлен, если честно, что он даже не загружает данное значение где-то.

+0

Я полагаю, что загрузка неизменяемого глобального, а затем не хранение его в любом месте - легкая вещь для оптимизации ... – mgilson

+0

Это интересно, особенно после прочтения этого [вопроса] (http://stackoverflow.com/questions/21260745/what- происходит, если вы-писать-а-переменной-имя-одна-в-питон). С именами переменных они помещаются в стек и сразу же исчезают. – jayelm

+0

@mgilson Да, но я не привык к тому, что Python ничего не оптимизирует ... – glglgl

1

Петля, безусловно, что-то делает, хотя, возможно, ничего полезного. Если вы находитесь в интерактивной оболочке, выход представляет собой бесконечный поток 1 s. В сценарии не будет выхода.

В питона, 1 вычисляет True, поэтому цикл while похож на while True:

Попробуйте это:

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

И вы обнаружите вторую строчку никогда не печатает.

2

Вы, кажется, работаете под каким-то заблуждением. Я не знаю, правильно ли я интерпретирую вас, но при нормальных обстоятельствах программа, которую вы пишете, даже не имеет возможности не «делать что-то»: это фундаментальный аспект компьютера, который постоянно выполняет инструкции ,

Единственный способ, по-вашему, сделать компьютер «не делать ничего», если вы программируете на аппаратном уровне, где вы могли бы остановить CPU, но на обычных архитектурах, только ядро ​​имеет доступ к такие привилегированные инструкции и языки программирования высокого уровня, такие как Python, не раскрывают их.

Что вы можете сделать, чтобы ничего не делать на уровне пользовательской программы, это попросить ядро ​​не планировать ваш процесс, например, выполнив вызов sleep или вызов блокирующего ввода-вывода , или т.п. Однако, поскольку вы не делаете ничего подобного, однако, альтернативы для вашей программы нет, кроме как выполнить. Просить «проверить», делает ли это что-то вроде просить подтвердить, что 1 + 1 = 2: Это просто по определению.

Смежные вопросы