Skip to content
Home / Fundamentals

Scope Concept

In programming, a scope refers to the area of a program where a particular variable or function is visible and can be accessed. Scopes can be either global or local.

Scope Types in Python

There are two types of scope in Python: global scope and local scope.

Global Scope

Global scope refers to variables and functions that are defined at the top level of a program, outside of any function or class definition. These variables and functions are accessible from anywhere in the program, and are called global variables and global functions.

Here is an example of defining a global variable and function in Python:

x = 10   # global variable

def foo():
    print(x)   # accesses the global variable x

foo()   # prints 10

Local Scope

Local scope refers to variables and functions that are defined inside a function or class definition. These variables and functions are only accessible from within the function or class, and are called local variables and local functions.

Here is an example of defining a local variable and function in Python:

def foo():
    x = 20   # local variable
    print(x)   # prints 20

foo()   # prints 20
print(x)   # generates an error because x is not defined in the global scope

Enclosing Scope

In Python, it is possible for a nested function or class to access variables and functions defined in the enclosing scope, which is the scope of the outer function or class. This is known as enclosing scope.

Here is an example of a nested function accessing a variable defined in the enclosing scope:

def outer():
    x = 10   # variable defined in the enclosing scope

    def inner():
        print(x)   # accesses the variable x defined in the enclosing scope

    inner()

outer()   # prints 10

Here is an example of a nested class accessing a variable defined in the enclosing scope:

def outer():
    x = 10   # variable defined in the enclosing scope

    class Inner:
        def foo(self):
            print(x)   # accesses the variable x defined in the enclosing scope

    Inner().foo()

outer()   # prints 10

Note that it is not possible to modify variables in the enclosing scope from within a nested function or class. To do this, you can use the nonlocal keyword, which allows you to modify variables defined in the enclosing scope.

For example:

def outer():
    x = 10   # variable defined in the enclosing scope

    def inner():
        nonlocal x
        x = 20   # modifies the value of the variable x defined in the enclosing scope

    inner()
    print(x)   # prints 20

outer()   # prints 20

Global Variables

Global variables are variables that are defined at the top level of a program, outside of any function or class definition. As such, they are accessible from anywhere in the program.

To access a global variable from within a function, you can use the global keyword. For example:

x = 10   # global variable

def foo():
    global x
    x = 20   # changes the value of the global variable x
    print(x)   # prints 20

foo()   # prints 20
print(x)   # prints 20

It is generally a good idea to avoid using global variables, as they can make code difficult to understand and maintain. Instead, it is often better to pass variables as arguments to functions or return them as values from functions.

Best Practices for Python Scope

Here are some best practices to follow when working with scopes in Python:

  • Avoid using global variables: Global variables can make code difficult to understand and maintain, as they can be accessed and modified from anywhere in the program. Instead, it is often better to pass variables as arguments to functions or return them as values from functions.
  • Use local variables when possible: Local variables are only accessible within the function or class in which they are defined, which makes it clear where they are used and what they are used for.
  • Use the nonlocal keyword sparingly: The nonlocal keyword allows you to modify variables defined in the enclosing scope, but it can make code difficult to understand and maintain. Use it only when necessary, and consider refactoring your code to avoid using it if possible.