Python的作用域问题(Python scoping problem)

2019-09-21 05:23发布

我有一个简单的例子:


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

我的蟒蛇范围规则的理解决定,这应该按预期工作。 我有其他的代码,其中可正常工作,但减少一个非工作的代码片段是微不足道的情况下上述也不起作用。 所以我难倒。

Answer 1:

到分配local_varfunc使得本地func -这样的print语句引用的是“非常非常局部”变量之前,它曾经分配给作为例外说。 作为JTB表示,在Python 3,你可以解决这个nonlocal ,但它是从您的代码清晰,使用print语句,你发现你在Python 2.传统的解决方案工作在Python 2,以确保分配是不一个barename因而不会使变量更多的地方比你愿意的话,例如:

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()

分配给索引不是一个barename,因此不影响locality和因为Python 2.2它是嵌套内部功能完全可以接受的指代是当地居民外含有函数的变量,这是所有这版本确实( 分配给barenames是一个不同的问题比参考变量)。



Answer 2:

标准的方式来解决这个问题前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()


Answer 3:

Python的作用域规则进行了讨论,并在此相关的问题解释说:

原因直观UnboundLocalError行为



Answer 4:

Python的3.0之前,功能写不出来在外部范围的非全局变量。 Python3先后引进nonlocal的关键字,让这项工作。 你会增加nonlocal local_var在顶部func()的定义得到你所期望的输出。 见PEP 3104 。

如果你没有在Python 3个工作,你必须使变量全球性的,或将其传递到功能莫名其妙。



文章来源: Python scoping problem