我正在尝试理解Python范围。见这个例子:
x = 'foo'
def outer(p):
print x
x = 'bar'
def inner(p):
print x
inner(1)
print x
outer(1)
此代码会导致以下错误:
Traceback (most recent call last):
File "scopes2.py", line 11, in <module>
outer(1)
File "scopes2.py", line 4, in outer
print x
UnboundLocalError: local variable 'x' referenced before assignment
现在,如果我删除了x = 'bar'
行,那么它会按预期运行。
为什么我不能使用x
中print x
的全局outer()
,直到我将其重新绑定到'bar'
?
答案 0 :(得分:3)
只要您在函数中有赋值,该变量就被视为整个函数的本地变量。你不能只引用全球“直到本地任务”
What are the rules for local and global variables in Python(强调我的)
在Python中,仅在函数内引用的变量是 隐含全球性。 如果在任何地方为变量分配了新值 在函数体内,它被假定为本地。如果是变量 在函数内部分配了一个新值,变量是 隐式本地,您需要明确地将其声明为“全局”。
虽然起初有点令人惊讶,但片刻的考虑解释了 这个。一方面,要求全局分配变量提供了一个 禁止意外的副作用。另一方面,如果全球化了 所有全局引用都需要,你将全局使用全局 时间。您必须将每个对内置的引用声明为全局 功能或导入模块的组件。这种混乱会 打败全球宣言的有用性 副作用。
答案 1 :(得分:1)
要从函数中引用全局x
,请使用
def outer(p):
global x
print x
x = 'bar'
...
请注意,x
的分配也会重新绑定全局 x
。如果您不想发生,请重命名其中一个变量(或者,更好的是,不要使用全局变量)。