首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python < 3中有类似‘非本地’的东西吗?

在Python < 3中有类似‘非本地’的东西吗?
EN

Stack Overflow用户
提问于 2012-03-07 22:27:52
回答 3查看 367关注 0票数 3

我得到了一段这样的代码:

代码语言:javascript
复制
foo = None

def outer():
    global foo
    foo = 0

    def make_id():
        global foo
        foo += 1
        return foo


    id1 = make_id() # id = 1
    id2 = make_id() # id = 2
    id3 = make_id() # ...

我发现在最外层的作用域中定义foo很难看,我宁愿只在outer函数中定义它。据我所知,在Python3中,这是由nonlocal完成的。我想要的东西有没有更好的方法?我更喜欢在outer中声明和赋值foo,也许在inner中去掉它的global

代码语言:javascript
复制
def outer():
    foo = 0

    def make_id():
        global foo
        foo += 1     # (A)
        return foo

    id1 = make_id() # id = 1
    id2 = make_id() # id = 2
    id3 = make_id() # ...

(A)不起作用,foo似乎是在最外面的范围内搜索的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-07 22:29:20

不,最好的替代方法是函数属性。

票数 0
EN

Stack Overflow用户

发布于 2012-03-07 22:41:24

为此,我使用了1元素列表:

代码语言:javascript
复制
def outer():
    foo = [0]
    def make_id():
        r = foo[0]
        foo[0] += 1
        return r
    return make_id

make_id = outer()
id1 = make_id()
id2 = make_id()
...

这与使用nonlocal相同,但代价是语法稍显繁琐(使用foo[0]而不是foo)。

票数 6
EN

Stack Overflow用户

发布于 2012-03-07 22:34:27

不,将其作为make_id函数的参数。更好的做法是将您的id放在一个类中,并将make_id作为实例方法,并将该实例作为全局实例(如果需要)。

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

https://stackoverflow.com/questions/9603278

复制
相关文章

相似问题

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