Modifying Variables in Non-Global, Enclosing Scope in Python
When working with nested functions, it's often necessary to access and modify variables defined in an enclosing scope that is neither global nor accessible through dynamic scoping. This can present challenges in Python, which implements lexical scoping.
Consider the following example:
def A(): b = 1 def B(): # Can access 'b' but cannot modify it directly print(b) B() A()
In this code, the variable b is defined in the enclosing scope of the B() function. However, attempting to modify b directly within B() results in an UnboundLocalError because it's not declared as local to B().
To address this, Python offers two solutions:
Python 3: Use the nonlocal Keyword
On Python 3, the nonlocal keyword allows you to modify variables in the nearest enclosing scope excluding globals. Here's how to use it:
def foo(): a = 1 def bar(): nonlocal a a = 2 bar() print(a) # Output: 2
In this example, the nonlocal keyword makes a a non-local variable within the bar() function, enabling its modification.
Python 2: Use Mutable Objects
On Python 2, where nonlocal is not available, you can use mutable objects, such as lists or dictionaries. Instead of reassigning variables, you can mutate the object's value:
def foo(): a = [] def bar(): a.append(1) bar() bar() print(a) # Output: [1, 1]
Here, the a variable is mutable, and the bar() function can modify its values by appending to the list.
The above is the detailed content of How Can I Modify Variables in a Non-Global, Enclosing Scope in Python?. For more information, please follow other related articles on the PHP Chinese website!