Ámbito y variables en funciones

  • Duración de la lección: 7:24 min

[1]:
#
# Accesso a variables definidas fuera del ámbito de la función
# =============================================================================
#
username = "wick.john"


def print_username():
    print(username)


print_username()
wick.john

Explicación:

+-- Ambiente del módulo -------------+      +-- Ambiente de la función ------------------+
| {                                  |      | creado con la llamada a la funcion         |
|     'username': "wick.john",       |      | {                                          |
|     'print_username': #function,   | <=== |     'ambiente_padre': ambiente del modulo  |
| }                                  |      | }                                          |
+------------------------------------+      +--------------------------------------------+
[2]:
#
# Ambito de las variables
# =============================================================================
#
int_var = 5


def my_function(int_var):
    int_var = 3
    print("inside:", int_var)


my_function(int_var)
print("outside:", int_var)
inside: 3
outside: 5
Codigo                Memoria
-----------------------------------------------------------
                      ambiente = {}, funcion = {}
int_var = 5
                      ambiente = {'int_var': 5}, funcion = {}
my_function(int_var)
                      ambiente = {'int_var': 5}, funcion = {'int_var': 5}
    (cuerpo de la funcion)
    int_var = 3
                      ambiente = {'int_var': 5}, funcion = {'int_var': 3}

Comandos global y nonlocal

[3]:
#
# Se define la variable como global
#
global_var = 0


def user_function():
    """Cambia el valor de la variable global"""
    global global_var
    global_var += 1


display(global_var)
user_function()
display(global_var)
0
1
[4]:
#
# Sin nonlocal
#
def outer():
    n = 1

    def inner():
        n = 2
        print(n)

    inner()
    print(n)


outer()
2
1
[5]:
#
# Con nonlocal
#
def outer():
    n = 1

    def inner():
        nonlocal n
        n = 2
        print(n)

    inner()
    print(n)


outer()
2
2