首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python 2.x中的非本地关键字

Python 2.x中的非本地关键字
EN

Stack Overflow用户
提问于 2010-07-07 06:31:11
回答 8查看 44.1K关注 0票数 123

我正在尝试在Python2.6中实现一个闭包,并且我需要访问一个非局部变量,但是这个关键字似乎在Python2.x中不可用。在这些版本的python中,应该如何访问闭包中的非局部变量?

EN

回答 8

Stack Overflow用户

发布于 2013-04-16 16:51:24

下面的解决方案受到answer by Elias Zamaria的启发,但与答案相反的是,它确实正确地处理了外部函数的多次调用。对于当前的outer调用,“变量”inner.y是本地的。只是它不是一个变量,因为这是被禁止的,而是一个对象属性(对象是函数inner本身)。这非常难看(请注意,该属性只能在定义inner函数之后创建),但似乎很有效。

代码语言:javascript
复制
def outer():
    def inner():
        inner.y += 1
        return inner.y
    inner.y = 0
    return inner

f = outer()
g = outer()
print(f(), f(), g(), f(), g()) #prints (1, 2, 1, 3, 2)
票数 39
EN

Stack Overflow用户

发布于 2010-07-07 06:51:19

我认为这里的关键是你所说的“访问”是什么意思。在闭包作用域之外读取变量应该没有问题,例如,

代码语言:javascript
复制
x = 3
def outer():
    def inner():
        print x
    inner()
outer()

应该可以正常工作(打印3)。然而,覆盖x的值不起作用,例如,

代码语言:javascript
复制
x = 3
def outer():
    def inner():
        x = 5
    inner()
outer()
print x

将仍然打印3。根据我对PEP-3104的理解,这就是非本地关键字要涵盖的内容。正如在PEP中提到的,您可以使用一个类来完成相同的事情(有点混乱):

代码语言:javascript
复制
class Namespace(object): pass
ns = Namespace()
ns.x = 3
def outer():
    def inner():
        ns.x = 5
    inner()
outer()
print ns.x
票数 14
EN

Stack Overflow用户

发布于 2012-12-10 11:25:14

在Python2中还有另一种实现非局部变量的方法,以防这里的任何答案因任何原因而不可取:

代码语言:javascript
复制
def outer():
    outer.y = 0
    def inner():
        outer.y += 1
        return outer.y
    return inner

f = outer()
print(f(), f(), f()) #prints 1 2 3

在变量的赋值语句中使用函数名是多余的,但在我看来,这比将变量放在字典中更简单、更干净。从一个调用到另一个调用时会记住该值,就像在Chris B.的回答中一样。

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

https://stackoverflow.com/questions/3190706

复制
相关文章

相似问题

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