Python中的UnboundLocalError

这个问题在这里已经有了答案:

  • 在Python 5中已经定义的变量之后如何更改变量的答案
  • 在不同于创建它们的函数中使用全局变量18个答案

  • Python没有变量声明,所以它必须找出变量本身的范围。 它通过一个简单的规则来实现:如果函数内部有一个变量赋值,那么该变量被认为是局部的[1]。 因此,线

    counter += 1
    

    隐式地使counter本地increment() 。 尽管如此,尝试执行这一行,会尝试在分配之前读取局部变量counter的值,导致UnboundLocalError 。[2]

    如果counter是全局变量,则global关键字将有所帮助。 如果increment()是一个本地函数并counter一个局部变量,那么可以在Python 3.x中使用nonlocal


    您需要使用全局语句,以便修改全局变量计数器,而不是本地变量:

    counter = 0
    
    def increment():
      global counter
      counter += 1
    
    increment()
    

    如果定义的counter的封闭范围不是全局范围,那么在Python 3.x中,可以使用非本地语句。 在Python 2.x的相同情况下,您将无法重新分配给非本地名称counter ,因此您需要使counter变为可变并对其进行修改:

    counter = [0]
    
    def increment():
      counter[0] += 1
    
    increment()
    print counter[0]  # prints '1'
    

    要回答你的主题中的问题,*是的,在Python中有闭包,除了它们只适用于函数内部,并且(在Python 2.x中)它们是只读的; 您不能将该名称重新绑定到不同的对象(但如果该对象是可变的,则可以修改其内容)。 在Python 3.x中,可以使用nonlocal关键字来修改一个闭包变量。

    def incrementer():
        counter = 0
        def increment():
            nonlocal counter
            counter += 1
            return counter
        return increment
    
    increment = incrementer()
    
    increment()   # 1
    increment()   # 2
    

    *原始问题的标题问到Python中的闭包。

    链接地址: http://www.djcxy.com/p/23877.html

    上一篇: UnboundLocalError in Python

    下一篇: How can I check the syntax of Python script without executing it?