为了账号安全,请及时绑定邮箱和手机立即绑定

Python 2.x中的nonlocal关键字

Python 2.x中的nonlocal关键字

至尊宝的传说 2019-10-16 14:03:55
我正在尝试在python 2.6中实现闭包,我需要访问一个非局部变量,但似乎此关键字在python 2.x中不可用。在这些版本的python中,如何在闭包中访问非局部变量?
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

内部函数可以读取 2.x中的非局部变量,而不必重新绑定它们。这很烦人,但是您可以解决它。只需创建一个字典,然后将数据作为元素存储在其中即可。禁止内部函数对非局部变量引用的对象进行突变。


要使用Wikipedia中的示例:


def outer():

    d = {'y' : 0}

    def inner():

        d['y'] += 1

        return d['y']

    return inner


f = outer()

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


查看完整回答
反对 回复 2019-10-16
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

它确实可以正确处理外部函数的多次调用。“变量” inner.y位于的当前调用中outer。因为它不是变量,所以它不是变量,而是对象属性(对象是函数inner本身)。这非常丑陋(请注意,只能在inner定义函数后才能创建属性),但看起来很有效。


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)


查看完整回答
反对 回复 2019-10-16
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

与字典相比,非本地类的混乱程度更低。修改@ChrisB的示例:


def outer():

    class context:

        y = 0

    def inner():

        context.y += 1

        return context.y

    return inner

然后


f = outer()

assert f() == 1

assert f() == 2

assert f() == 3

assert f() == 4

每个外部()调用都会创建一个称为上下文的新的独特类(不仅仅是一个新实例)。因此,它避免了@Nathaniel提防共享上下文。


g = outer()

assert g() == 1

assert g() == 2


assert f() == 5


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 939 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信