Python作用域问题

3 投票
4 回答
1060 浏览
提问于 2025-04-15 13:13

我有一个简单的例子:


def func1():
    local_var = None

    def func(args):
        print args,
        print "local_var:", local_var

        local_var = "local"

    func("first")
    func("second")

func1()

我希望输出是:

first local_var: None
second local_var: local

但是,我实际得到的输出是:

first local_var:
Traceback (most recent call last):
  File "test.py", line 13, in 
    func1()
  File "test.py", line 10, in func1
    func("first")
  File "test.py", line 6, in func
    print "local_var:", local_var
UnboundLocalError: local variable 'local_var' referenced before assignment

我对Python作用域规则的理解是,这应该按预期工作。我还有其他代码是正常工作的,但把一个不工作的代码片段简化到上面的简单例子时也不行。所以我很困惑。

4 个回答

1

在3.0版本之前,解决这个问题的标准方法是

def func1():
    local_var = [None]

    def func(args):
        print args,
        print "local_var:", local_var[0]

        local_var[0] = "local"

    func("first")
    func("second")

func1()
1

这里讨论了Python的作用域规则,相关内容可以在这个问题中找到:

为什么会出现让人困惑的UnboundLocalError错误

9

func里给local_var赋值,这个变量就变成了func内部的局部变量——所以在print语句中引用这个“非常非常局部”的变量时,它还没有被赋值,这就是异常提示的意思。正如jtb所说,在Python 3中,你可以用nonlocal来解决这个问题,但从你的代码和print语句来看,你是在用Python 2。Python 2的传统解决办法是确保赋值不是给一个简单的变量名,这样就不会让这个变量变得比你想要的更局部,比如:

def func1():
    local_var = [None]

    def func(args):
        print args,
        print "local_var:", local_var[0]

        local_var[0] = "local"

    func("first")
    func("second")

func1()

这里的索引赋值不是给一个简单的变量名,因此不会影响变量的局部性。而且自从Python 2.2以来,嵌套的内部函数可以引用外部函数中的局部变量,这就是这个版本所做的(给简单变量名赋值引用变量是两个不同的问题)。

撰写回答