Bird
Raised Fist0
Pythonprogramming~3 mins

Why Nonlocal keyword in Python? - Purpose & Use Cases

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
The Big Idea

What if you could fix tricky bugs by simply telling Python which variable to change inside nested functions?

The Scenario

Imagine you have a small box inside a bigger box, and you want to change something inside the smaller box from outside it. Without a special way, you can only change things in the smallest box or the biggest box, but not the middle one. This is like trying to change a variable inside a nested function without a special keyword.

The Problem

Without the nonlocal keyword, changing a variable inside a nested function creates a new local copy instead of updating the variable in the outer function. This leads to confusion and bugs because the outer variable stays unchanged, making your code behave unexpectedly and harder to fix.

The Solution

The nonlocal keyword lets you tell Python to use the variable from the nearest outer function, not create a new one. This way, you can easily update variables in nested functions, keeping your code clear and working as you expect.

Before vs After
โœ— Before
def outer():
    x = 5
    def inner():
        x = 10  # This creates a new local x, outer x stays 5
    inner()
    print(x)  # prints 5
โœ“ After
def outer():
    x = 5
    def inner():
        nonlocal x
        x = 10  # updates outer x
    inner()
    print(x)  # prints 10
What It Enables

It enables you to cleanly and safely modify variables in outer functions from inside nested functions, making your code easier to write and understand.

Real Life Example

Think of a game where you have a score counter inside a main game function, and a smaller function inside it updates the score. Using nonlocal lets the smaller function change the main score directly without confusion.

Key Takeaways

Without nonlocal, nested functions can't change outer variables properly.

nonlocal tells Python to use the nearest outer variable, not create a new one.

This makes nested function code clearer and less error-prone.

Practice

(1/5)
1. What does the nonlocal keyword do in Python?
easy
A. Declares a variable as global across all modules.
B. Allows an inner function to modify a variable from its outer function.
C. Creates a new local variable inside the inner function.
D. Prevents any changes to variables in the outer function.

Solution

  1. Step 1: Understand variable scopes

    Variables inside a function are local by default, and inner functions cannot change outer variables unless specified.
  2. Step 2: Role of nonlocal

    The nonlocal keyword allows the inner function to access and modify variables from the nearest enclosing function scope.
  3. Final Answer:

    Allows an inner function to modify a variable from its outer function. -> Option B
  4. Quick Check:

    nonlocal changes outer function variable = A [OK]
Hint: Nonlocal lets inner functions change outer variables [OK]
Common Mistakes:
  • Confusing nonlocal with global keyword
  • Thinking nonlocal creates new variables
  • Assuming nonlocal works outside functions
2. Which of the following is the correct syntax to use nonlocal inside a nested function?
easy
A. local variable_name
B. global variable_name
C. outer variable_name
D. nonlocal variable_name

Solution

  1. Step 1: Recall the syntax for nonlocal

    The keyword nonlocal is followed by the variable name to indicate it refers to an outer function's variable.
  2. Step 2: Compare options

    Only nonlocal variable_name uses the correct keyword and syntax: nonlocal variable_name.
  3. Final Answer:

    nonlocal variable_name -> Option D
  4. Quick Check:

    Correct nonlocal syntax = C [OK]
Hint: Use 'nonlocal' followed by variable name inside inner function [OK]
Common Mistakes:
  • Using 'global' instead of 'nonlocal'
  • Writing 'local' or 'outer' which are invalid keywords
  • Forgetting to write variable name after nonlocal
3. What will be the output of the following code?
def outer():
    x = 5
    def inner():
        nonlocal x
        x = 10
    inner()
    return x
print(outer())
medium
A. 10
B. None
C. Error: no binding for nonlocal 'x'
D. 5

Solution

  1. Step 1: Trace variable assignment

    Variable x is set to 5 in outer(). The inner function declares nonlocal x and sets x = 10.
  2. Step 2: Effect of nonlocal on x

    The nonlocal keyword allows inner() to modify x in outer(). So after calling inner(), x becomes 10.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    nonlocal changes outer x to 10 = D [OK]
Hint: nonlocal lets inner change outer variable value [OK]
Common Mistakes:
  • Thinking x remains 5 because inner is separate
  • Expecting a syntax error for nonlocal usage
  • Assuming inner creates a new local x
4. Find the error in this code snippet:
def counter():
    count = 0
    def increment():
        count = count + 1
        return count
    return increment()
print(counter())
medium
A. increment() should not return count
B. count should be global, not local
C. Missing 'nonlocal count' inside increment()
D. No error, code runs fine

Solution

  1. Step 1: Identify variable scope issue

    Inside increment(), count = count + 1 tries to read and write count. Without nonlocal, Python treats count as local, but it is used before assignment.
  2. Step 2: Fix with nonlocal

    Adding nonlocal count tells Python to use the count from counter(), allowing modification.
  3. Final Answer:

    Missing 'nonlocal count' inside increment() -> Option C
  4. Quick Check:

    Modify outer variable needs nonlocal = A [OK]
Hint: Add nonlocal before modifying outer variable inside inner function [OK]
Common Mistakes:
  • Using global instead of nonlocal
  • Ignoring variable scope causing UnboundLocalError
  • Returning count without incrementing properly
5. Consider this code:
def make_accumulator():
    total = 0
    def add(value):
        nonlocal total
        total += value
        return total
    return add
acc = make_accumulator()
print(acc(5))
print(acc(3))
print(acc(-2))

What is the output of this code?
hard
A. 5\n8\n6
B. 5\n3\n-2
C. 0\n5\n8
D. Error: nonlocal used incorrectly

Solution

  1. Step 1: Understand closure with nonlocal

    The function make_accumulator() returns add, which remembers total. The nonlocal total lets add update total each call.
  2. Step 2: Trace calls to acc

    First call: total=0+5=5, prints 5.
    Second call: total=5+3=8, prints 8.
    Third call: total=8+(-2)=6, prints 6.
  3. Final Answer:

    5 8 6 -> Option A
  4. Quick Check:

    Accumulator sums values using nonlocal total = B [OK]
Hint: nonlocal keeps state in nested function closures [OK]
Common Mistakes:
  • Expecting total to reset each call
  • Confusing nonlocal with global
  • Thinking output is separate values, not cumulative