首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不理解为什么会发生UnboundLocalError (闭包)

不理解为什么会发生UnboundLocalError (闭包)
EN

Stack Overflow用户
提问于 2012-02-14 01:11:39
回答 6查看 236.2K关注 0票数 193

我在这里做错了什么?

代码语言:javascript
复制
counter = 0

def increment():
  counter += 1

increment()

上面的代码抛出了一个UnboundLocalError

EN

回答 6

Stack Overflow用户

发布于 2012-02-14 01:13:58

您需要使用global statement,以便修改全局变量计数器,而不是局部变量:

代码语言:javascript
复制
counter = 0

def increment():
  global counter
  counter += 1

increment()

如果定义counter的封闭作用域不是全局作用域,那么在Python3.x上可以使用nonlocal statement。在Python2.x上,在同样的情况下,您将无法重新分配非本地名称counter,因此您需要将counter设置为可变名称并对其进行修改:

代码语言:javascript
复制
counter = [0]

def increment():
  counter[0] += 1

increment()
print counter[0]  # prints '1'
票数 91
EN

Stack Overflow用户

发布于 2012-02-14 01:21:14

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

代码语言:javascript
复制
def incrementer():
    counter = 0
    def increment():
        nonlocal counter
        counter += 1
        return counter
    return increment

increment = incrementer()

increment()   # 1
increment()   # 2

*这个问题最初是关于Python中的闭包。

票数 27
EN

Stack Overflow用户

发布于 2012-02-14 01:31:13

代码抛出UnboundLocalError的原因已经在其他答案中得到了很好的解释。

但在我看来,您正在尝试构建像itertools.count()一样工作的东西。

所以你为什么不尝试一下,看看它是否适合你的情况:

代码语言:javascript
复制
>>> from itertools import count
>>> counter = count(0)
>>> counter
count(0)
>>> next(counter)
0
>>> counter
count(1)
>>> next(counter)
1
>>> counter
count(2)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9264763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档