直观的UnboundLocalError行为的原因
我偶然发现了这一点:
a = 5
def x()
print a
a = 6
x()
抛出一个UnboundLocalException
。现在,我知道为什么会发生这种情况(在此作用域之后,a
是受约束的,因此a
在整个作用域中被认为是局部的)。
在这种情况下:
a = 5
def x()
print b
b = 6
x()
这很有道理。但是第一种情况具有直观的逻辑,这意味着:
a = 5
def x()
print globals()["a"]
a = 6 # local assignment
x()
我想这是有原因的,为什么不允许“直观”版本,但这是什么?尽管这可能是“显式比隐式更好”的情况,但globals()
总是对我摸索总是觉得不干净。
从一个角度来看,发生在我身上的实际情况是我不得不改变一下别人的脚本。在我的(短暂的)更改中,我在脚本运行时做了一些文件重命名,所以我插入了
import os
os.rename("foo", "bar")
进入脚本。这种插入发生在函数内部。该模块已经os
在顶层导入(我没有检查),并且os.somefunction
在函数内部但在插入之前进行了一些调用。这些电话显然触发了UnboundLocalException
。
因此,有人可以向我解释此实现背后的原因吗?是否可以防止用户犯错误?对于字节码编译器,“直观”的方式只会使事情变得更复杂吗?还是我可能没有想到的歧义?
-
具有相同名称的相同名称是指在同一线性代码流中完全不同的变量,这令人难以置信的复杂性使它错开了头脑。考虑:
def aaaargh(alist): for x in alist: print a a = 23
在您想要的Python变体中,此代码应该做什么?
a
在同print
一条语句中,难道在循环的第一个分支与第二个分支(假设存在第二个)中引用完全不同且不相关的变量吗?即使对于单项列表,它的工作方式是否也与非循环代码不同?严重的是,这种疯狂的方式说谎了-
甚至没有想到可怕的实现问题,只是试图记录和教导这一点,这可能会使我切换语言。语言,其实施者,其老师,其学习者,其从业者承担所有这些概念负担的基本动机是什么, 以支持和鼓励半隐式,非明示使用GLOBAL VARIABLES
?这似乎不是一个值得的目标,是吗?