Table of Contents

What Will You Learn
In this section, you’ll learn how Python handles variable scope inside and outside of functions. You'll explore the difference between global and local variables, how to declare them properly, and when to use the global keyword. Understanding scope is crucial for avoiding bugs, writing maintainable code, and controlling how data flows in your Python programs.


Understanding the difference between global and local variables is essential for writing correct and maintainable code. As a beginner, you will frequently define and access variables inside functions. However, improper use of variable scope can lead to bugs that are hard to track. Knowing when a variable is accessible and when it is not helps you control the behavior of your program. It also makes your code more predictable and prevents accidental changes to important data. Global variables are useful for sharing data across multiple functions, but overusing them can make code harder to debug. Local variables, on the other hand, provide better encapsulation and reduce side effects. 

What Are Global and Local Variables in Python?

In Python, variables are defined within a certain scope. A local variable is declared inside a function and only exists during that function’s execution. A global variable is declared outside all functions and can be accessed anywhere in the code.

Example 1: Local variable


    def greet():
        message = "Hello"
        print(message)

    greet()
  • message is a local variable, visible only within greet(). Trying to access it outside will cause an error.

Example 2: Global variable


    count = 0

    def increment():
        global count
        count += 1

    increment()
    print(count)
  • count is a global variable, defined outside the function. We use the global keyword to modify it inside increment().

Example 3: Name conflict


    x = 5

    def example():
        x = 10
        print(x)

    example()
    print(x)
  • The function defines its own local x, which does not affect the global x. Output will be 10 and then 5.

By default, Python treats any variable assigned in a function as local, unless you explicitly declare it as global using the global keyword.

What Are the Differences Between Global and Local Variables in Python?

Global and local variables differ primarily in their scope and lifetime. A global variable exists throughout the entire execution of a program, while a local one is created when a function runs and disappears after it returns. Global variables can be accessed from anywhere in the file, but local variables are accessible only inside the function where they are defined. Changing a global variable from within a function requires the global keyword. Without it, any assignment creates a new local variable with the same name. Overusing global variables leads to tightly coupled and hard-to-test code. Local variables promote encapsulation and safer program logic.

Feature Global Variable Local Variable
Defined where? Outside of any function Inside a specific function
Scope Accessible throughout the file Accessible only inside the function
Lifetime Lives until the program ends Exists only during function execution
Requires keyword? Needs global to modify inside a function No keyword needed
Risk of side effects High, especially in large applications Low, since scope is limited
Readability Can reduce readability if overused Improves code clarity
Testing and Debugging Harder to isolate issues Easier to test and debug
Recommended for use Only when necessary and controlled Preferable in most function-based logic

What Are the Best Practices for Managing Local and Global Variables in Python?

Proper variable scope management improves code quality, readability, and reliability. Beginners often misuse global variables, which leads to unexpected behavior and maintenance difficulties. While globals are not inherently bad, they should be used sparingly and intentionally. Prefer local variables for all temporary calculations and function-specific logic. If you need to share data across multiple functions, consider returning values or using function parameters instead. Maintain a clear structure and avoid naming conflicts.

Best practices include:

  • Minimize the use of global variables. Use them only when data must persist across many parts of your codebase.
  • Use function parameters to pass data. Instead of reading or modifying global variables, pass values explicitly.
  • Return results from functions. Return data rather than setting global state inside the function.
  • Use clear and distinct variable names. Avoid reusing the same names in global and local scope.
  • Avoid mutable global data structures. Lists and dictionaries as globals can be modified unintentionally.
  • Encapsulate logic in functions or classes. This keeps your code modular and protects variable scope.
  • Use global keyword only when absolutely necessary. It should signal a deliberate decision to alter shared state.

Common Beginner Mistakes

Mistake 1: Trying to modify a global variable without the global keyword

Beginners often assume that assigning a value to a global variable inside a function will update it. However, Python treats such assignment as the creation of a new local variable unless explicitly marked as global. This causes unexpected results or bugs when the global variable remains unchanged.

Incorrect:


    count = 0

    def increment():
        count += 1  # UnboundLocalError

    increment()

Correct:


    count = 0

    def increment():
        global count
        count += 1

    increment()

Mistake 2: Accessing a local variable outside its function

A variable created inside a function does not exist outside of it. Beginners sometimes try to use such variables globally, which results in a NameError.

Incorrect:


    def calculate():
        result = 10 + 5

    print(result)  # NameError

Correct:


    def calculate():
        result = 10 + 5
        return result

    print(calculate())

Mistake 3: Naming conflicts between local and global variables

Using the same variable name in both global and local scopes can lead to confusion and errors. The local version will shadow the global one, which may not be the intended behavior.

Incorrect:


    value = 100

    def print_value():
        value = 50
        print(value)

    print_value()
    print(value)  # Unexpected difference

Correct:


    global_value = 100

    def print_value():
        local_value = 50
        print(local_value)
    
    print_value()
    print(global_value)

Mistake 4: Relying too much on global variables for function logic

Putting all shared data in global variables can make functions dependent and hard to reuse. A better approach is to pass parameters and return values.

Inefficient:


    name = "Alice"

    def greet():
        print(f"Hello, {name}")

Better:


    def greet(name):
        print(f"Hello, {name}")

    greet("Alice")

Mistake 5: Modifying mutable global objects without realizing side effects

Modifying lists or dictionaries declared globally can lead to side effects across your program, especially in larger codebases.

Risky:


    data = []

    def add_item(item):
        data.append(item)  # This modifies the global list

Better:


    def add_item(data, item):
        data.append(item)
        return data

Frequently Asked Questions (FAQ)

What are the rules for local and global variables in Python?

Python determines the scope of variables at compile time. A local variable is any variable assigned within a function body. Unless explicitly declared as global, Python assumes it belongs to the function's local scope. A global variable is defined outside of any function and can be read inside a function. However, if you want to assign a new value to it inside a function, you must declare it with the global keyword.

For example:


    x = 10

    def change_x():
        global x
        x = 20

Without the global keyword, the assignment x = 20 would create a new local variable x, leaving the global x unchanged. It’s also important to avoid modifying mutable global objects like lists or dictionaries without understanding their impact. Overall, clear variable naming, returning results from functions, and minimizing global state are good practices when dealing with variable scope.

How can I access a global variable inside a function without modifying it?

You can read the value of a global variable inside a function without using the global keyword. Python allows you to reference global variables freely as long as you don’t try to assign a new value to them. The confusion often arises when you attempt to reassign a global variable without declaring it as global, which turns it into a local variable and causes errors.

Example:


    name = "Alice"

    def greet():
        print(f"Hello, {name}")  # Access is allowed
        
    greet()

However, if you try to reassign the value without global, Python assumes it's a new local variable, and if you read it before assigning, it raises an UnboundLocalError.

Wrong:


    count = 10

    def update():
        print(count)  # Error: count is considered local but used before assignment
        count = 20

To avoid this, use global count if you plan to modify it.

When should I use the global keyword in Python?

You should use the global keyword only when a function needs to modify a variable that was defined at the global scope. Without this keyword, any assignment inside the function will be treated as a new local variable, regardless of whether a global variable with the same name exists.

Example:


    total = 0

    def add():
        global total
        total += 1

Using global tells Python to use the global total instead of creating a new local one. However, overusing global variables, especially mutable ones, makes your code fragile and harder to debug. It's better to return values or use function parameters when possible. Use global variables when the state must be truly shared and you understand the side effects. Reserve them for constants or very specific configuration data when modularization is not practical.

Can I have a local and global variable with the same name?

Yes, but it is not recommended. When a local variable shares the same name as a global one, the local version shadows the global one inside the function. This means the function will only see the local variable, not the global one, which often causes confusion.

Example:


    x = 5

    def show():
        x = 10
        print(x)
        
    show()       # prints 10 (local)
    print(x)     # prints 5 (global)

Although valid, this can mislead readers into thinking the global variable was changed. If you need to modify the global variable, use the global keyword. If your goal is to define a local variable, consider choosing a distinct name to avoid accidental shadowing. Good naming practices reduce these issues and make your code easier to read and maintain.

Are global variables shared across functions in the same file?

Yes, global variables are accessible from any function in the same file, provided they were defined outside any function and not shadowed locally. This means multiple functions can read and even modify the same global variable, as long as they use the global keyword when changing it.

Example:


        counter = 0

        def inc():
            global counter
            counter += 1
        
        def dec():
            global counter
            counter -= 1
        
        inc()
        dec()
        print(counter)

While this sharing is technically convenient, it creates hidden dependencies between functions. If one function changes a global variable, it may affect others in unexpected ways. This makes debugging harder. A better alternative is to pass the variable as a parameter and return the modified value, keeping the code more modular and predictable.

What happens if I assign to a global variable inside a function without declaring it as global?

If you assign a value to a variable inside a function without declaring it as global, Python treats it as a new local variable. Even if a global variable with the same name exists, it will be ignored. Attempting to use the variable before assigning it in the same function will result in an UnboundLocalError.

Example:


        x = 50

        def test():
            x += 1  # Error: local variable referenced before assignment
        
        test()

To fix this, you must declare x as global:


    def test():
        global x
        x += 1

Always remember: assignment inside a function creates a local variable unless declared otherwise. To avoid confusion, use clear variable names and avoid unnecessary reassignment of global values within functions.