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

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)

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
添加回答
举报