Las variables permiten guardar valores y utilizarlos más adelante. En Python no necesitas declarar el tipo por adelantado: asignas un valor a un nombre y el intérprete administra la referencia. Esta simplicidad facilita comenzar, pero también exige comprender nombres válidos, tipos, mutabilidad, alcance y conversiones para evitar errores.
Antes de avanzar, consulta la guía de tipos de datos en Python, el artículo sobre entrada y salida, la explicación de operadores, el tutorial de funciones y la guía de alcance de variables.
Las fuentes externas principales son la referencia oficial de asignaciones y la introducción oficial de Python.
Crear una variable
nombre = "Ana"
edad = 28
altura = 1.68
activo = True
El símbolo = asigna el valor de la derecha al nombre de la izquierda. No representa una ecuación matemática.
Mostrar variables
print(nombre)
print(edad)
print(f"{nombre} tiene {edad} años")
Las f-strings permiten insertar valores dentro de texto de forma legible.
Reglas para los nombres
Un nombre puede contener letras, números y guion bajo, pero no comenzar con un número. Python distingue mayúsculas y minúsculas:
precio = 10
Precio = 20
Son variables diferentes. Evita nombres que solo cambian por capitalización, porque dificultan la lectura.
Nombres recomendados
precio_total = 199.90
usuario_activo = True
cantidad_intentos = 3
Utiliza snake_case para variables y funciones. Prefiere nombres que expliquen el propósito. x puede ser adecuado en una fórmula breve, pero no para almacenar el total de una factura en un sistema grande.
Palabras reservadas
import keyword
print(keyword.kwlist)
No puedes utilizar palabras como if, for, class o return como nombres.
Tipos dinámicos
dato = 10
print(type(dato))
dato = "diez"
print(type(dato))
El mismo nombre puede apuntar después a otro tipo. Aunque es válido, cambiar el significado de una variable en el mismo flujo suele generar confusión. Mantén un propósito consistente.
Comprobar el tipo
cantidad = 5
if isinstance(cantidad, int):
print("Es un entero")
isinstance() es preferible a comparar directamente con type() cuando pueden existir subclases.
Convertir valores
texto = "42"
numero = int(texto)
precio = float("19.90")
mensaje = str(numero)
Las conversiones pueden fallar:
entrada = input("Cantidad: ").strip()
try:
cantidad = int(entrada)
except ValueError:
print("Debes escribir un entero")
Asignación múltiple
x, y = 10, 20
nombre, edad, activo = "Luis", 35, True
La cantidad de nombres debe coincidir con la cantidad de valores.
Intercambiar valores
a = 5
b = 8
a, b = b, a
Python evalúa los valores antes de realizar las asignaciones, por lo que no necesitas una variable temporal.
Asignar el mismo valor
contador_a = contador_b = 0
Con objetos inmutables como enteros suele ser sencillo. Con listas puede provocar estado compartido:
lista_a = lista_b = []
lista_a.append("dato")
print(lista_b)
Ambos nombres apuntan a la misma lista. Para listas independientes:
lista_a = []
lista_b = []
Referencias y mutabilidad
original = [1, 2, 3]
otro_nombre = original
otro_nombre.append(4)
print(original)
La asignación no copia el objeto. Para una copia superficial:
copia = original.copy()
Si existen objetos anidados, analiza si necesitas copy.deepcopy().
Objetos inmutables
Enteros, floats, strings y tuplas son inmutables. Una operación crea un nuevo objeto:
numero = 10
numero += 1
texto = "Hola"
texto += " mundo"
El nombre cambia de referencia; el objeto original no se modifica.
Constantes por convención
IVA = 0.21
MAX_INTENTOS = 3
RUTA_CONFIG = "config.json"
Python no impide reasignarlas. Las mayúsculas comunican que no deberían cambiar durante la ejecución.
Eliminar un nombre
temporal = "dato"
del temporal
Después, utilizar el nombre genera NameError. del elimina la referencia, no garantiza la destrucción inmediata del objeto si existen otras referencias.
Variables dentro de funciones
def calcular_total(precio, cantidad):
subtotal = precio * cantidad
return subtotal
precio, cantidad y subtotal son locales. No existen fuera de la función.
Variables globales
moneda = "EUR"
def mostrar_moneda():
print(moneda)
Leer una global es posible, pero modificarla requiere atención. En general, es mejor pasar valores como argumentos y devolver resultados.
def cambiar_moneda(nueva_moneda):
return nueva_moneda.strip().upper()
moneda = cambiar_moneda("usd")
La palabra global
contador = 0
def incrementar():
global contador
contador += 1
Funciona, pero crea dependencias ocultas. Utiliza clases, parámetros o estructuras de estado cuando el programa crezca.
Alcance nonlocal
def crear_contador():
valor = 0
def incrementar():
nonlocal valor
valor += 1
return valor
return incrementar
nonlocal modifica una variable de la función envolvente. Se utiliza en closures, pero no debe sustituir una estructura clara cuando el estado es complejo.
Desempaquetar colecciones
persona = ("Ana", 28, "Madrid")
nombre, edad, ciudad = persona
También puedes capturar varios elementos:
primero, *intermedios, ultimo = [1, 2, 3, 4, 5]
Valores opcionales con None
usuario_encontrado = None
if usuario_encontrado is None:
print("No existe")
None representa ausencia intencional. No lo confundas con cero, string vacío o lista vacía.
Evitar valores mutables como predeterminados
# Evita este patrón
def agregar(valor, elementos=[]):
elementos.append(valor)
return elementos
La lista se crea una sola vez y se comparte entre llamadas. Utiliza:
def agregar(valor, elementos=None):
if elementos is None:
elementos = []
elementos.append(valor)
return elementos
Anotaciones de tipo
nombre: str = "Ana"
edad: int = 28
precios: list[float] = [10.0, 20.5]
Las anotaciones ayudan a editores y analizadores, pero Python no las aplica automáticamente durante la ejecución.
Entrada de usuario y variables
nombre = input("Nombre: ").strip()
while not nombre:
print("El nombre es obligatorio")
nombre = input("Nombre: ").strip()
Valida inmediatamente después de recibir datos. No permitas que un valor inválido viaje por todo el programa.
Variables de entorno
import os
modo = os.getenv("APP_ENV", "development")
Las variables de entorno sirven para configuración externa. Siempre llegan como texto y deben validarse y convertirse.
Comprender NameError
print(total)
Si total no fue definido en el alcance actual, Python genera NameError. Revisa errores tipográficos, orden de ejecución y ramas condicionales.
if condicion:
total = 100
# total puede no existir aquí
Inicializa la variable o reorganiza la lógica para garantizar una asignación.
Sombreado de nombres integrados
# Evita usar estos nombres
list = [1, 2]
str = "texto"
sum = 10
Después no podrás llamar fácilmente a las funciones integradas correspondientes. Utiliza lista, texto y total.
Errores frecuentes
Los fallos más comunes son utilizar nombres poco claros, mezclar tipos, creer que una asignación copia una lista, depender demasiado de globales, sombrear funciones integradas y usar una variable antes de asignarla. También es frecuente confundir = con ==.
Conclusión
Una variable es un nombre asociado a un objeto. Para utilizarlas correctamente, elige nombres descriptivos, mantén un propósito consistente, valida conversiones y comprende la diferencia entre objetos mutables e inmutables. Reduce el estado global y utiliza funciones para controlar el alcance. Estas bases permiten escribir programas más claros, previsibles y fáciles de probar.






