Я написал следующую игрушку:
def foo():
x = 5
def foo2():
print("Locals: ", locals())
print("Vars: ", vars())
print("dir: ", dir())
print("CP 1")
print("x =", x)
print("CP 2")
print("Locals: ", locals())
print("Vars: ", vars())
print("dir: ", dir())
foo2()
foo()
print("-----------------------")
def foo():
x = 5
def foo2():
print("Locals: ", locals())
print("Vars: ", vars())
print("dir: ", dir())
print("CP 1")
print("x =", x)
print("CP 2")
del x
print("Locals: ", locals())
print("Vars: ", vars())
print("dir: ", dir())
foo2()
foo()
, которая дает следующий результат:
Locals: {'x': 5}
Vars: {'x': 5}
dir: ['x']
CP 1
x = 5
CP 2
Locals: {'x': 5}
Vars: {'x': 5}
dir: ['x']
-----------------------
Locals: {}
Vars: {}
dir: []
CP 1
Traceback (most recent call last):
File "testing.py", line 34, in <module>
foo()
File "testing.py", line 32, in foo
foo2()
File "testing.py", line 26, in foo2
print("x =", x)
UnboundLocalError: local variable 'x' referenced before assignment
>>>
Обратите внимание, как поведение второго издания изменяется даже в областях кода вверх которому две редакции идентичны (и, следовательно, должны давать одинаковые результаты). Поскольку x, согласно первой редакции, действительно существует в локальном пространстве имен, оператор del не должен быть проблемой.
Вопросы:
1) Правильно ли первое или второе издание? Должен ли x существовать в пространстве имен или нет?
2) Есть ли объяснение такому поведению или это ошибка?
(продолжение до 2: 3) Должно ли второе издание работать без ошибок или оно должно взломать sh?)