如何从函数的闭包中访问/修改变量?

时间:2019-03-24 05:00:59

标签: python closures

如果我有一个包含一些非局部变量的函数(在闭包中),我该如何访问该变量?我可以修改它吗?如果可以,如何修改?这是此类功能的示例:

def outer():
    x = 1
    def inner(y):
        nonlocal x
        return x + y
    return inner

inner = outer()
# how do I get / change the value of x inside inner?

(很抱歉,如果在其他地方已经回答过这个问题;我找不到它,所以我认为一旦解决,我就会分享答案)

1 个答案:

答案 0 :(得分:2)

函数包含的变量作为元组存储在__closure__属性中。变量以cell类型存储,这似乎只是变量本身的可变容器。您可以访问cell作为cell.cell_contents存储的变量。由于单元是可变的,因此可以通过更改单元的内容来更改函数的非局部变量的值。这是一个示例:

def outer():
    x = 1
    def inner(y):
        nonlocal x
        return x + y
    return inner

inner = outer()

print(inner(2))  # 3
print(inner.__closure__)  # (<cell at 0x7f14356caf78: int object at 0x56487ab30380>,)
print(inner.__closure__[0].cell_contents)  # 1

inner.__closure__[0].cell_contents = 10
print(inner(2))  # 12
print(inner.__closure__[0].cell_contents)  # 10

编辑-以上答案适用于Python 3.7+。对于其他Python版本,您可以以相同的方式访问闭包,但您无法修改(包括跟踪变量设置单元格值的Python问题here's)。