Python Para Principiantes (V) - Funciones y Módulos (II)

Ámbito de las variables

Índice:

Scope o Ámbito

Decimos que el “scope”(en inglés) es el ámbito donde “viven” las variables.

Hay distintos ámbitos y estos definen si se puede (o no) acceder a las variables.

Ámbito local

Las variables creadas dentro de una función pertenecen solo a la función. No pueden ser accedidas desde afuera

1
2
3
4
5
def mifuncion():
  x = 1200 #Variable local, solo existe dentro de la función
  print(x)

mifuncion() 
1
2
3
4
5
6
7
# Si queremos acceder desde afuera dará error.
def mifuncion():
  x = 1200
  print(x)

mifuncion() 
print(x)

Función dentro de una Función

En este caso definimos x dentro de mifuncion() pero x también puede ser accedida por la función interna funcInterna().

1
2
3
4
5
6
7
def mifuncion():
  x = 1200  #Variable local
  def funcInterna(): #Función local, puede acceder a las variables locales
    print(x)
  funcInterna()

mifuncion() 

Ámbito global

Una variable creada en el cuerpo principal del programa es global y pertenece al “ámbito global”. Las variables globales están disponibles dentro de cualquier ámbito, tanto local como global.

1
2
3
4
5
6
7
8
9
x = 18 #Variable global, puede ser accedida desde cualquier ámbito.

def mifuncion():  
  print(x)

mifuncion()


print(x) 

Variables con el mismo nombre

Si trabajamos con variables del mismo nombre dentro y fuera de una función, el intérprete las trata como dos variables distintas, una que estará global (fuera de la función) y otra local(dentro de la función).

1
2
3
4
5
6
7
8
9
x = 1 #Variable global

def mifuncion():
  x = 9 #Variable local 
  print(x)

myfunc()

print(x) #Imprime la variable global

Palabra reservada global

Si se necesita crear una variable global dentro de un ámbito local se puede usar la palabra reservada global.

Recuerde que realizar esto no es considerado una buena práctica de programación, debe usarse lo menos posible.

1
2
3
4
5
6
7
def mifuncion():
  global miVariable # la variable x estará disponible fuera del ámbito local
  miVariable = 100

mifuncion()

print(miVariable) 

Se puede usar para cambiar el valor de una variable global dentro de una función

1
2
3
4
5
6
7
8
9
x = 120
print(x)

def mifuncion():
  global x 
  x = 55 # cambia el valor de x fuera de la función  

mifuncion()
print(x) 

Listas y diccionarios como argumentos

Las listas y los diccionarios, como estudiamos en encuentros anteriores, son mutables.

Cuando se las pasamos a una función, no estamos pasando los valores como hacemos habitualmente, sino que estamos pasando la lista/diccionario en sí misma/o. Esto quiere decir que: cualquier cambio que se realice en la lista/diccionario dentro de la función va a modificar a la variable (lista o diccionario) original.

Esto solo sucede con los objetos mutables:

  • list (lista)
  • dict (diccionario)
  • sets (conjunto)

Con los inmutables no ocurre:

  • int
  • float
  • bool
  • string
  • tuple
1
2
3
4
5
6
7
8
9
#Ejemplo con lista
miLista = ["a","b","c"]
print(miLista)

def agregar(lista):   #cualquier modificación afecta a la lista original, es decir al argumento
    lista.append("d") #Añado "d" a la lista

agregar(miLista) #Llamo a la función pasando lista como argumento, esto se llama pasaje por referencia
print(miLista)
1
2
3
4
5
6
7
8
9
#Ejemplo con diccionario
miDiccionario = {"Nombre":"Carlos","Apellido":"Gomez"}
print(type(miDiccionario))

def agregar(diccionario):   #cualquier modificación afecta al diccionario original, es decir al argumento
    miDiccionario["edad"] = 25

agregar(miDiccionario) #Llamo a la función pasando el dict como argumento, esto se llama pasaje por referencia
print(miDiccionario)
updatedupdated2021-02-032021-02-03