如果我有一个包含一些非局部变量(在闭包中)的函数,我如何访问该变量?我可以修改它吗?如果可以,如何修改?这是此类函数的示例:
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?
Run Code Online (Sandbox Code Playgroud)
(如果这个问题已经在其他地方得到了回答,我深表歉意;我找不到它,所以我想一旦解决了我就会分享答案)
Nat*_*han 10
函数的封闭变量作为元组存储在__closure__属性中。变量存储为cell类型,这似乎只是变量本身的可变容器。cell您可以访问 a存储为 的变量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
Run Code Online (Sandbox Code Playgroud)
编辑 - 上述答案适用于 Python 3.7+。对于其他 Python 版本,您可以以相同的方式访问闭包,但无法修改封闭的变量(这是跟踪设置单元格值的 Python 问题)。
| 归档时间: |
|
| 查看次数: |
1412 次 |
| 最近记录: |