Home  >  Article  >  Backend Development  >  Can Nested Functions Modify Variables in Enclosing Scopes in Python?

Can Nested Functions Modify Variables in Enclosing Scopes in Python?

Susan Sarandon
Susan SarandonOriginal
2024-10-21 18:40:03350browse

Can Nested Functions Modify Variables in Enclosing Scopes in Python?

Unbound Local Variables in Nested Function Scopes

In Python, nested functions access variables defined in their enclosing scopes, enabling code reuse and encapsulation. However, attempting to modify a variable in an enclosing scope within a nested function can result in an "UnboundLocalError" if the variable is not declared as nonlocal or global.

Consider the following code:

<code class="python">def outer():
    ctr = 0

    def inner():
        ctr += 1</code>

When you invoke inner(), you'll encounter an "UnboundLocalError" because ctr is not defined within the inner function. To fix this, you can use the following approaches:

For Python 3 and later:

Use the nonlocal Keyword

The nonlocal keyword allows you to modify variables defined in an enclosing scope from within a nested function.

<code class="python">def outer():
    ctr = 0

    def inner():
        nonlocal ctr
        ctr += 1</code>

For Python 2 and earlier:

Use a Data Structure to Hold the Variable

In Python 2, nested functions cannot modify variables in enclosing scopes, so you must use a data structure to hold the variable and pass it to the nested function.

<code class="python">def outer():
    ctr = [0]

    def inner():
        ctr[0] += 1</code>

Replace all occurrences of ctr in your code with ctr[0].

The above is the detailed content of Can Nested Functions Modify Variables in Enclosing Scopes in Python?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
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