Variable scope in Python

In Python, variable scope refers to the region of a program where a particular variable is accessible. It determines where you can access a variable within your code. Python has four levels of variable scope:

  • Local Scope
  • Enclosing Scope – Applied to nested function
  • Global Scope
  • Built-In Scope

Local Scope

Variables defined within a function are considered to have local scope. They can only be accessed within that function. Once the function exits, the variables also cease to exist.

def my_function():
    x = 100
    print("Accessing x locally: ",x)

my_function()
print("Accessing x outside function: ",x)

# Output
Accessing x locally:  100
NameError: name 'x' is not defined

Enclosing (or Nonlocal) Scope

This applies to nested functions. If a variable is not defined in the current local scope but is defined in an enclosing function’s scope, it can be accessed within the inner function.

def outer():
    message = "Hello Proedu!!!"

    def inner():
        # Nested function able to access variable of outer function.
        print(message)

    # Calling inner() function inside outer() function.
    inner()

# Calling outer function.
outer()

# Output
Hello Proedu!!!

Global Scope

Variables defined at the top level of a Python module or explicitly declared as global keyword within a function are considered to have global scope. They can be accessed from anywhere in the module or program.

message = "Hello Proedu!!!"
count = 100

def my_function():
    print("Accessing global variable 'message': ", message)
    print("Accessing global variable 'count': ", count)

my_function()

# Output
Accessing global variable 'message':  Hello Proedu!!!
Accessing global variable 'count':  100

Built-in Scope

This refers to names that are preassigned in Python, such as built-in functions like print(), len(), etc. They are available everywhere in the code.

When a variable is referenced, Python searches for it in the current scope. If not found, it checks the enclosing scopes, then the global scope, and finally the built-in scope. If the variable is not found at all, Python raises a NameError. However, you need to be cautious when using global variables as they can lead to code that is hard to understand and debug.

print(len([1, 2, 3]))

# Output
3

Built-in scope examples in Python include built-in functions, exceptions, and other built-in objects.

# Built-in Functions
print("Hello, Proedu.co!")  # print() is a built-in function
result = len([1, 2, 3, 4])  # len() is a built-in function

# Built-in Exceptions:
try:
    # Some code that may raise an exception
    result = 100 / 0
except ZeroDivisionError as e:
    print("An error occurred:", e)  # ZeroDivisionError is a built-in exception

# Built-in Constants:
print(True)  # True is a built-in constant representing the boolean value True
print(False)  # False is a built-in constant representing the boolean value False

# Built-in Types:
my_list = [1, 2, 3]  # list is a built-in type
my_dict = {"key": "value"}  # dict is a built-in type

# Built-in Methods (associated with built-in types):
my_string = "Hello, Proedu.co!"
print(my_string.upper())  # upper() is a built-in method of the str type

# Built-in Constants in the math module:
import math
print(math.pi)  # pi is a built-in constant in the math module
print(math.e)  # e is a built-in constant in the math module

Built-in names are always accessible without the need for any import statements because they are part of the Python language itself.

Leave a Reply