Хорошо, прочитав ответы от Дуга и Джима, я думаю, у меня есть идея о том, как это работает. Прежде всего из примеров работы в REPL (IPython, по умолчанию)
Files: Если вы пишете это в файле:
if True:
print("Hi")
else:
I am an error. What can you do about it?
и запустить файл, он будет бросать SyntaxError. Это доказывает, что всякий раз, когда мы выполняем код python из файла, он генерирует байт-код и, поскольку оператор в else не является допустимым выражением python, мы получаем SyntaxError.
REPL: С REPL все становится немного зависимым. В интерпретаторе python, если вы набираете
>>>def foo():
if True:
print("Hey")
else:
I am an error. What can you do about it?
>>>foo()
Hey
Успешное выполнение означает отсутствие байт кода справа? Оставайтесь на линии.
Если вы пишете это:
>>>x = 10
>>>def foo():
print(x)
x += 1
>>>foo()
И Boom! все разваливается, вы получаете команду UnboundLocalError в print (x). Что означает байт-код.
Так что же здесь происходит?
Если python находит одно единственное вхождение переменной, он пытается оптимизировать свою работу, сначала прочитав все из них. Итак, во втором примере, когда код встречает печать (x), он пытается найти все операции над x. Вскоре он находит утверждение x + = 1.Поскольку нет никакого упоминания о х в локальной области и питон никогда не ищет переменную в глобальном масштабе, если не упомянуто явно, мы имеем
UnboundLocalError: local variable 'x' is referenced before assignment
убедительное доказательство
Если мы пишем что-то вроде этого:
>>>x = 10
>>>def foo():
if True:
print(x)
else:
x+=1
>>>foo()
UnboundLocalError: local variable 'x' referenced before assignment
Это все!
x + = 1 никогда не будет выполнен, но поскольку оператор печати печатает x, а другая ссылка (x + = 1) была проблемой, произошла ошибка, возникшая перед печатью значения. Первый случай работал отлично без SyntaxError в REPL, потому что он никогда не беспокоился о том, чтобы смотреть в выражение else, потому что это никогда не имело значения.
В первом примере это синтаксическая ошибка. Если вы поместите его в .py-файл и попытаетесь его выполнить, вы увидите. – tdelaney
Я думаю, что у вас есть вопрос, что вы * выполняете код в оболочке интерпретатора, то есть REPL. –
Если мы поместим оба из них в интерактивную оболочку .. возникает расхождение. Вы знаете, почему? –