猿问

Python 2.x中的nonlocal关键字

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



至尊宝的传说
浏览 902回答 3
3回答

眼眸繁星

内部函数可以读取 2.x中的非局部变量,而不必重新绑定它们。这很烦人,但是您可以解决它。只需创建一个字典,然后将数据作为元素存储在其中即可。禁止内部函数对非局部变量引用的对象进行突变。要使用Wikipedia中的示例:def outer():    d = {'y' : 0}    def inner():        d['y'] += 1        return d['y']    return innerf = outer()print(f(), f(), f()) #prints 1 2 3

哈士奇WWW

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

斯蒂芬大帝

与字典相比,非本地类的混乱程度更低。修改@ChrisB的示例:def outer():    class context:        y = 0    def inner():        context.y += 1        return context.y    return inner然后f = outer()assert f() == 1assert f() == 2assert f() == 3assert f() == 4每个外部()调用都会创建一个称为上下文的新的独特类(不仅仅是一个新实例)。因此,它避免了@Nathaniel提防共享上下文。g = outer()assert g() == 1assert g() == 2assert f() == 5
随时随地看视频慕课网APP

相关分类

Python
我要回答