Los métodos append() y extend() en listas de Python se utilizan para agregar elementos, pero lo hacen de manera fundamentalmente diferente:
append(obj) añade un solo elemento (cualquier objeto, incluido una lista) al final de la lista original.extend(iterable) añade todos los elementos del objeto iterable uno por uno (como si los "desplegara" al añadir).Ejemplo:
lst = [1, 2, 3] lst.append([4, 5]) # Resultado: [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # Resultado: [1, 2, 3, 4, 5]
Esta diferencia a menudo se convierte en la causa de errores lógicos, cuando se espera una lista "plana", pero se obtiene una lista anidada.
¿Qué pasará si realizas
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)? ¿Cómo se ve list1? ¿Cuál es la diferencia delist1.extend(list2)?
Respuesta:
list1.append(list2) el resultado es: [1, 2, [3, 4]] — la segunda lista se agregó como un solo elemento (lista anidada).list1.extend(list2) el resultado es: [1, 2, 3, 4] — los elementos de la segunda lista se "desplegaron" y se añadieron como elementos separados.Historia
Un desarrollador, al combinar los resultados del análisis de varios archivos, hacía
output.append(parsed_lines). Como resultado, en lugar de una larga lista plana, obtenía una lista de listas (un elemento por cada archivo), lo que rompía todo el procesamiento posterior — en particular, las funciones que esperaban una secuencia de cadenas comenzaron a arrojar errores con los datos de entrada.
Historia
En un proyecto se utilizó
extendpara agregar una cadena como "foo" (es decir, la cadena se consideraba iterable). Esto llevó a que los caracteres de la cadena se convirtieran en elementos separados de la lista:['f', 'o', 'o']en lugar de "foo" como se deseaba.
Historia
Al serializar datos para enviarlos en JSON, se aplicaron
append/extendal bucle sin entender la diferencia. Como resultado, se obtenían estructuras que violaban el esquema, lo que provocaba que algunos microservicios fallaran en la etapa de validación o funcionaran incorrectamente.