Python append () vs. + operador en las listas, ¿por qué dan resultados diferentes?

¿Por qué estas dos operaciones ( append() resp. + ) Dan resultados diferentes?

 >>> c = [1, 2, 3] >>> c [1, 2, 3] >>> c += c >>> c [1, 2, 3, 1, 2, 3] >>> c = [1, 2, 3] >>> c.append(c) >>> c [1, 2, 3, [...]] >>> 

En el último caso hay en realidad una recursión infinita. c[-1] c son iguales. ¿Por qué es diferente con la operación + ?

Para explicar “por qué”:

La operación + agrega los elementos de la matriz a la matriz original. La operación array.append inserta la matriz (o cualquier objeto) en el final de la matriz original, lo que resulta en una referencia a self en ese lugar (de ahí la recursión infinita).

La diferencia aquí es que la operación + actúa específica cuando agrega una matriz (está sobrecargada como otras, vea este capítulo sobre secuencias) al concatenar el elemento. Sin embargo, el método de adición hace literalmente lo que pides: agrega el objeto en el lado derecho que le das (la matriz o cualquier otro objeto), en lugar de tomar sus elementos.

Una alternativa

Use extend() si desea usar una función que actúe de manera similar al operador + (como otros también lo han mostrado aquí). No es prudente hacer lo contrario: tratar de imitar adjuntar con el operador + para listas (vea mi enlace anterior sobre por qué).

Poca historia

Por diversión, un poco de historia: el nacimiento del módulo de matriz en Python en febrero de 1993. Puede que te sorprenda, pero las matrices se agregaron mucho después de que las secuencias y las listas empezaran a existir.

append es append un elemento a una lista. Si desea ampliar la lista con la nueva lista, debe utilizar extend .

 >>> c = [1, 2, 3] >>> c.extend(c) >>> c [1, 2, 3, 1, 2, 3] 

El operador de concatenación + es un operador de infijo binario que, cuando se aplica a las listas, devuelve una nueva lista que contiene todos los elementos de cada uno de sus dos operandos. El método list.append() es un mutator en la list que anexa su único argumento de object (en su ejemplo específico, la lista c ) a la list temas. En su ejemplo, esto da como resultado que se agregue una referencia a sí mismo (de ahí la recursión infinita).

Una alternativa a la concatenación ‘+’

El método list.extend() también es un método mutador que concatena su argumento de sequence con la list temas. Específicamente, agrega cada uno de los elementos de sequence en orden de iteración.

Un aparte

Al ser un operador, + devuelve el resultado de la expresión como un nuevo valor. Al ser un método de mutator sin encadenamiento, list.extend() modifica la lista de sujetos en el lugar y no devuelve nada.

Arrays

He agregado esto debido a la posible confusión que la respuesta de Abel anterior puede causar al mezclar la discusión de listas, secuencias y arreglos. Arrays se agregaron a Python después de las secuencias y listas, como una forma más eficiente de almacenar matrices de tipos de datos integrales. No confunda arrays con lists . Ellos no son los mismos.

De la matriz de documentos :

Las matrices son tipos de secuencia y se comportan de forma muy similar a las listas, excepto que el tipo de objetos almacenados en ellas está restringido. El tipo se especifica en el momento de la creación del objeto utilizando un código de tipo, que es un solo carácter.

Las listas de Python son heterogéneas, es decir, los elementos de la misma lista pueden ser cualquier tipo de objeto. La expresión: c.append(c) anexa el objeto c cualquiera que sea, a la lista. En el caso de que la misma lista sea un miembro de la lista.

La expresión c += c agrega dos listas juntas y asigna el resultado a la variable c . El operador + sobrecargado se define en las listas para crear una nueva lista cuyos contenidos son los elementos de la primera lista y los elementos de la segunda lista.

Así que estas son realmente solo expresiones diferentes usadas para hacer diferentes cosas por diseño.

El método que estás buscando es extend() . De la documentación de Python:

 list.append(x) Add an item to the end of the list; equivalent to a[len(a):] = [x]. list.extend(L) Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L. list.insert(i, x) Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x). 

debes usar extend ()

 >>> c=[1,2,3] >>> c.extend(c) >>> c [1, 2, 3, 1, 2, 3] 

otra información: agregar vs. extender

Vea la documentación :

list.append (x)

  • Añadir un elemento al final de la lista; equivalente a un [len (a):] = [x].

list.extend (L) – Extienda la lista agregando todos los elementos en la lista dada; equivalente a un [len (a):] = L.

c.append(c) “anexa” c a sí mismo como un elemento . Dado que una lista es un tipo de referencia, esto crea una estructura de datos recursiva.

c += c es equivalente a extend(c) , que agrega los elementos de c a c.