具有嵌套函数作用域的UnboundLocalError

发布于 2021-01-29 17:22:53

我有这样的代码(简化):

def outer():
    ctr = 0

    def inner():
        ctr += 1

    inner()

但是ctr会导致错误:

Traceback (most recent call last):
  File "foo.py", line 9, in <module>
    outer()
  File "foo.py", line 7, in outer
    inner()
  File "foo.py", line 5, in inner
    ctr += 1
UnboundLocalError: local variable 'ctr' referenced before assignment

我怎样才能解决这个问题?我认为嵌套范围可以使我做到这一点。我已经尝试过使用“全局”,但是它仍然不起作用。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您使用的是Python 3,则可以使用以下nonlocal语句启用非本地名称的重新绑定:

    def outer():
        ctr = 0
    
        def inner():
            nonlocal ctr
            ctr += 1
    
        inner()
    

    如果您使用的Python 2没有nonlocal,则需要执行增量操作而无需重新绑定裸名(通过将计数器保留为某些裸名的项目或属性, 而不是
    裸名本身)。例如:

    ...
    ctr = [0]
    
    def inner():
        ctr[0] += 1
    ...
    

    当然,ctr[0]无论您ctr现在在其他任何地方使用裸机,都可以使用它。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看