修改封闭作用域中的变量:Python 式难题
在 Python 中,作用域的概念控制着变量的可见性和可访问性。在处理嵌套和封闭作用域时,修改外部作用域中的变量并不总是那么简单。
问题:UnboundLocalError
考虑以下代码片段:
def A(): b = 1 def B(): # Access 'b', no problem print(b) # Attempt to modify 'b' b = 2 # UnboundLocalError B() A()
这里,变量 b 是在 B 的封闭范围内定义的,但它不是全局的。尝试在 B 中直接修改 b 会导致 UnboundLocalError,因为 b 未在 B 中声明为局部变量。
解决方案:拥抱非全局作用域
在 Python 3 中,nonlocal 关键字发挥了作用。它允许您修改封闭的非全局范围内的变量。
def A(): b = 1 def B(): nonlocal b b = 2 B() print(b) # Output: 2
Python 2 的替代方案:可变性来救援
虽然 Python 3 有方便的nonlocal 关键字,Python 2 没有提供直接的解决方案。解决方法是使用可变对象(例如列表或字典)并改变它们的值,而不是重新分配变量。
def foo(): a = [] def bar(): a.append(1) bar() bar() print(a) # Output: [1, 1]
通过操作列表 a(它是一个对象),您实际上可以修改其内容,同时遵守 Python 2 的范围规则。
以上是如何在Python中修改封闭作用域中的变量?的详细内容。更多信息请关注PHP中文网其他相关文章!