Home > Backend Development > Python Tutorial > How Can I Modify Variables in a Non-Global, Enclosing Scope in Python?

How Can I Modify Variables in a Non-Global, Enclosing Scope in Python?

Susan Sarandon
Release: 2024-12-28 05:01:09
Original
585 people have browsed it

How Can I Modify Variables in a Non-Global, Enclosing Scope in Python?

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()
Copy after login

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
Copy after login

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]
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template