Las listas en Python son una de las estructuras de datos más usadas: permiten agrupar valores heterogéneos, modificar elementos y escribir código más legible. Aquí verás cómo inicializarlas, mutarlas, iterarlas y copiarlas sin efectos inesperados, con ejemplos claros y prácticos.
¿Qué son las listas en Python y por qué importan?
Las listas son una secuencia mutable que puede contener cualquier tipo de dato: enteros, strings, objetos o incluso otras listas. Al crear listas de listas, puedes construir matrices para representar datos en dos o más dimensiones. A diferencia de los strings, que son inmutables, las listas permiten cambiar sus elementos por índice, agregar o eliminar valores y recorrerlos con un for loop.
Hacen el desarrollo más sofisticado, legible y fácil de implementar.
Soportan tipos heterogéneos en una sola estructura.
Se usan de forma constante durante la carrera como programador.
¿Qué diferencia a listas y strings como secuencias?
Una lista puede mezclar tipos: números, textos y otras listas.
Un string es inmutable: no permite asignación por índice.
Una lista es mutable: puedes reasignar elementos por índice.
Ejemplos en Python:
# Inicialización literal con *square brackets*countries =["México","Venezuela","Colombia","Argentina"]ages =[12,18,24,34,50]# Inicialización funcional con la *built in function* list()empty =list()# Lista heterogénea (receta): nombre y cantidadesreceta =["ensalada",2,"lechugas",5,"jitomates"]# Mutabilidad: reasignación por índicecountries[0]="Ecuador"print(countries)# ["Ecuador", "Venezuela", "Colombia", "Argentina"]# Inmutabilidad de string: esto lanza un TypeErrorname ="David"# name[0] = "d" # TypeError: los strings no permiten asignación por índice
¿Cómo se inicializan e iteran listas en Python?
Puedes crear listas de forma literal con [] o con list(). Una vez en memoria, las recorres con un for simple y legible. A diferencia de range, que produce un iterador, una lista ya contiene los valores en memoria.
# Literal vs funcionalnums_literal =[1,2,3]nums_funcional =list((1,2,3))# a partir de un iterable# Iteración sobre una lista existente en memoriafor country in countries:print(country)# Comparación conceptual con range (range genera un iterador)for n inrange(5):print(n)
Inicialización literal: clara y directa.
Inicialización funcional: útil al convertir otros iterables.
For loop en listas: sintaxis concisa y legible.
¿Qué significa que las listas sean referenciales y cómo copiar sin efectos secundarios?
En Python, las listas son referenciales: almacenan referencias a los objetos en memoria, no los objetos en sí. Por eso, dos listas con los mismos valores son objetos distintos; su identidad en memoria difiere. Con strings iguales, la identidad puede coincidir según lo mostrado con la built in functionID.
¿Qué es un alias y por qué puede causar bugs?
Asignar una lista a otra variable crea un alias: ambas variables apuntan a la misma lista. Modificar una, modifica la otra.
countries =["México","Venezuela","Colombia","Argentina"]global_countries = countries # alias: misma referenciacountries[0]="Guatemala"print(countries)# ["Guatemala", "Venezuela", "Colombia", "Argentina"]print(global_countries)# También cambia: misma lista en memoria
Alias: reasignación de la referencia, no copia de contenido.
Efecto secundario: cambios inesperados en múltiples variables.
¿Cómo copiar una lista de forma segura con el módulo copy?
Para evitar efectos colaterales, usa el módulo copy y crea una copia nueva.
import copy
countries =["México","Venezuela","Colombia","Argentina"]# Copia segura (nueva lista con los mismos valores)global_countries = copy.copy(countries)countries[0]="Honduras"print(countries)# ["Honduras", "Venezuela", "Colombia", "Argentina"]print(global_countries)# ["México", "Venezuela", "Colombia", "Argentina"]
Listas con mismos valores pueden vivir en direcciones distintas de memoria.
Con alias, ambas variables comparten la misma lista.
Con copy, cada variable mantiene su propia lista.
¿Te quedó alguna duda sobre mutabilidad, alias o el for loop en listas? Comparte tu pregunta y cuéntame qué casos prácticos quieres explorar.
Desde python 3.3 no es necesario utilizar esa librería, si no que podemos utilizar el método list.copy(). Ej.:
global_countries = countries.copy()
Ésta sintaxis es más legible y hace que no necesites importar librerías. Yo lo utilizo mucho al trabajar con numpy.
Diferentes formas de copiar una lista
Este hilo detalla las formas de copiar una lista
++Copy the list, you have various possibilities:
++
You can use the builtin list.copy() method (available since python 3.3):
new_list = old_list.copy()
You can slice it:
new_list = old_list[:]
You can use the built in list() function:
new_list =list(old_list)
You can use generic copy.copy():
import copy
new_list = copy.copy(old_list)
If the list contains objects and you want to copy them as well, use generic copy.deepcopy():
import copy
new_list = copy.deepcopy(old_list)
Gran aporte gracias.
:o
Jugando un poco encontré que aunque si bien las listas son objetos que viven en diferentes lugares en la memoria, los objetos que contienen si son iguales vivirán en el mismo lugar en memoria, por ejemplo:
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a =[1,2,3,4,5]
>>> b = [1,2,3,4,5]
>>> id(a[0])
10914496
>>> id(b[0])
10914496
>>>
140264765992776
>>> id(b)
140264766007112
>>>
el id de a y de b son diferentes, pero id(a[0]) y id(b[0]) son iguales
Cosas curiosas que uno encuentra!
buenisimo el aporte
para los que vienen de otros lenguajes las list se manejan como arrays en otros lenguajes no es lo mismo pero es parecido para comprenderlo
Si es verdad. En el curso anterior se explico eso, pero no esta de mas la aclaracion
otra manera de copiar objetos iterables como listas o strings es utilizando la notación slice [::] por ejemplo
countries =["v","m","c"]global_countries = countries[::]
con esta notación obtenemos el mismo resultado que utilizar la libreria copy
Gracias, esto es importante saberlo!
Cuando vi que Aroesti se cambio la camisa, contesto indirectamente a mi pregunta, de si grabo todo el curso en una jornada.
Hay veces que Aroesti se ha aventado creo hasta 16 clases en un día... brutal. Todo el trabajo de claridad y preparación previo más el aguante estar al frente de la cámara explicando. Más algunos redbulls para aguantar jajajjaa
Tambien se puede copiar una lista asi, nueva_lista = vieja_lista.copy()
Creo que seria mejor si se usa la palabra, iterar en ves de ciclar no se pero se escucha bastante extraño xD
una lista es un objeto que funciona como iterador
excelente aporte
No es eso en sí, de hecho por defecto, las listas usan un método iter()
El cual es detectado por el interprete al hacer una iteración, recorriendo cada elemento de la lista, string, objeto, etc....
Si se quieren modificar los elementos de una dos listas que comparten los mismos elementos, y que cuando se haga dicho cambio solo afecte a la lista que estamos modificando, se utiliza el modulo copy.
Crear una variable que tome el valor de la lista para que ambas variables apunten al mismo valor en memoria. Si se cambia un elemento de la lista, se cambia en las dos variables.
Este libro es excelente, totalmente recomendado, además de que trae varios ejercicios que aparte de ser útiles son bastante interesantes.
Qué es un CRUD?
Un CRUD son las operaciones principales de una base de datos.
Las siglas quieren decir:
C: Create - Crear registros
R: Read- Leer registros
U: Update - Actualizar registros
D: Delete - Eliminar registros
Es una aplicacion, puede ser web como trello, o puede ser para desktop o para telefonos moviles donde puedes Crear una tarea o un parrafo que queda registrado y lo puedes Leer que en ingles se escribe Read o lo puedes Actualizar, traducido al ingles es Update y puedes eliminar el parrafo o lo registrado, en ingles borrar o eliminar es Delete. Y de ahi sale el acrónimo de CRUD.
Hay muchas formas de copiar valores para no apuntar a la misma referencia en memoria, pero cuál es mejor ? en cuestion de rendimiento, escalabilidad, etc.
Importando el módulo copy, el método copy de lista[], por slices, etc. ?
.
Las estructuras de datos estándar que incorpora Python son: list, tuple, dict, y set.
.
En estas clases veremos el uso de las listas las cuales pueden aplicar diferentes métodos para aumentar su funcionalidad. Los métodos son:
append(). Agrega un elemento al final de la lista.
list.append(item)
clear(). Quita todos los elementos de la lista.
list.clear()
copy(). Regresa (copia), los elementos de la lista.
new_list = list.copy()
count(). Regresa el número de veces que un elemento aparece en la lista.
list.count(element)
extend(). Agrega elementos de un iterable(lista, tupla, string, etc) al final de la lista actual.
list1.extend(iterable)
index() Regresa el índice del primer elemento con el valor espcificado.
list.index(element, start, end)
insert(). Agrega elementos en una posición de índice específica.
list.insert(i, elem)
pop(). Quita elementos de una posición específica y permite agregarlos a otra lista.
list.pop(index)
remove(). Elimina el primer elemento que encuentra en la lista con el valor dado. Regresa None.
list.remove(element)
reverse(). Invierte el orden de la lista. No toma argumentos.
list.reverse()
sort(). Ordena la lista de forma ascendente o descendente(reverse = True). No retorna valores.
list.sort(key=..., reverse=...)
tip para crear listas con range
definimos una variable que contenga a range
mi_lista ==range(10)
y pasamos la variable por la función list
list(mi_lista)
listo tendremos este output
print(mi_lista)
out
[0,1,2,3,4,5,6,7,8,9]
Creo que no es necesario importar copy, las listas tienen un metodo llamado copy(), para copiar
global_countries = country.copy()
También puedes usar slices para copiar una lista sin necesidad de utilizar ningún método, así:
list_2 = list_1[:]
@facmartoni Excelente D: no lo sabía
min 2:20, si son mutables porque el slider dice my_list[2] = 6? si previamente se le asigno a my_list = [1, 2, 3]?
Justamente por que son mutables (que pueden cambiar)
#esta haciendo la declaracion de la lista
my_list =[1,2,3]#luego esta haciendo una asignacion a la tercera "casilla" de esa lista
my_list[2]=6
#si imprime esta cadena te daria
[1,2,6]