Python局部范围混乱

时间:2014-02-24 19:56:06

标签: python scope

我正在尝试理解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'行,那么它会按预期运行。

为什么我不能使用xprint x的全局outer(),直到我将其重新绑定到'bar'

2 个答案:

答案 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。如果您不想发生,请重命名其中一个变量(或者,更好的是,不要使用全局变量)。