Я думаю, что я принципиально не понимаю, как Python делает такие вещи, как переменная область видимости и разрешение имен. В частности, тот факт, что функция broken()
ниже не работает, действительно удивляет меня. И хотя я какое-то время ловил рыбу в Интернете в поисках полезного объяснения, но я до сих пор не понимаю. Может кто-нибудь объяснить или дать ссылку на хорошее описание того, как этот материал работает в Python, с достаточным количеством подробностей, чтобы было очевидно, почему broken()
не работает после прочтения соответствующих материалов?
# Why does this code work fine
def okay0():
def foo():
L = []
def bar():
L.append(5)
bar()
return L
foo()
# and so does this
def okay1():
def foo():
def bar():
L.append(5)
L = []
bar()
return L
foo()
# but the following code raises an exception?
def broken():
def foo():
L = []
bar()
return L
def bar():
L.append(5)
foo()
# Example
test_list = [okay0, okay1, broken]
for test_function in test_list:
try:
test_function()
except:
print("broken")
else:
print("okay")