首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python装饰器中变量的作用域

python装饰器中变量的作用域
EN

Stack Overflow用户
提问于 2015-04-21 08:07:23
回答 1查看 2.5K关注 0票数 19

我在Python3装饰器中遇到了一个非常奇怪的问题。

如果我这样做:

代码语言:javascript
复制
def rounds(nr_of_rounds):
    def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            return nr_of_rounds
        return inner
    return wrapper

它工作得很好。但是,如果我这样做:

代码语言:javascript
复制
def rounds(nr_of_rounds):
    def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            lst = []
            while nr_of_rounds > 0:
                lst.append(func(*args, **kwargs))
                nr_of_rounds -= 1
            return max(lst)
        return inner
    return wrapper

我得到了:

代码语言:javascript
复制
while nr_of_rounds > 0:
UnboundLocalError: local variable 'nr_of_rounds' referenced before assignment

换句话说,如果我在返回中使用nr_of_rounds,我可以在内部函数中使用它,但我不能对它做其他任何事情。为什么会这样呢?

EN

回答 1

Stack Overflow用户

发布于 2015-04-26 03:12:00

目前还没有办法对封闭函数作用域中的变量执行相同的操作,但是Python3引入了一个新的关键字"nonlocal“,它的作用方式与全局相似,但用于嵌套函数作用域。

因此,在您的示例中,只需使用如下命令:

def inner(*args, **kwargs): nonlocal nr_of_rounds lst = [] while nr_of_rounds > 0: lst.append(func(*args, **kwargs)) nr_of_rounds -= 1 return max(lst) return inner

有关更多信息,请访问Short Description of the Scoping Rules?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29760593

复制
相关文章

相似问题

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