Python append() versus operador + en listas, ¿por qué dan resultados diferentes? [duplicar]

Resuelto ooboo asked hace 14 años • 7 respuestas

¿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, en realidad hay una recursividad infinita. c[-1]y cson iguales. ¿ Por qué es diferente con la +operación?

ooboo avatar Jan 07 '10 23:01 ooboo
Aceptado

Para explicar "por qué":

La +operación agrega los elementos de la matriz a la matriz original. La array.appendoperación inserta la matriz (o cualquier objeto) al final de la matriz original, lo que da como resultado una referencia a uno mismo en ese lugar (de ahí la recursividad infinita en su caso con listas, aunque con matrices, recibiría un error de tipo ).

La diferencia aquí es que la +operación actúa de forma específica cuando agregas una matriz (está sobrecargada como otras, consulta este capítulo sobre secuencias) al concatenar el elemento. El appendmétodo -sin embargo, hace literalmente lo que usted pide: agrega el objeto en el lado derecho que le da (la matriz o cualquier otro objeto), en lugar de tomar sus elementos.

Una alternativa

Úselo extend()si desea utilizar una función que actúe de manera similar al +operador (como otros también han mostrado aquí). No es aconsejable hacer lo contrario: intentar imitar appendal +operador para las listas (consulte mi enlace anterior sobre por qué). Más sobre las listas a continuación:

Liza

[editar] Varios comentaristas han sugerido que la pregunta es sobre listas y no sobre matrices. La pregunta ha cambiado, aunque debería haberla incluido antes.

La mayor parte de lo anterior sobre arrays también se aplica a las listas:

  • El +operador concatena dos listas juntas. El operador devolverá un nuevo objeto de lista.
  • List.appendno agrega una lista con otra, sino que agrega un solo objeto (que aquí es un list) al final de su lista actual. cPor lo tanto, sumarse a sí mismo conduce a una recursividad infinita.
  • Al igual que con las matrices, puede usar List.extendpara agregar extender una lista con otra lista (o iterable). Esto cambiará su lista actual in situ , a diferencia de +, que devuelve una nueva lista.

poca historia

Para divertirte, 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 aparecieran las secuencias y las listas.

Abel avatar Jan 07 '2010 16:01 Abel

El operador de concatenación +es un operador infijo binario que, cuando se aplica a listas, devuelve una nueva lista que contiene todos los elementos de cada uno de sus dos operandos. El list.append()método es un mutatoron listque agrega su objectargumento único (en su ejemplo específico, la lista c) al asunto list. En su ejemplo, esto da como resultado cagregar una referencia a sí mismo (de ahí la recursividad infinita).

Una alternativa a la concatenación '+'

El list.extend()método también es un método mutador que concatena su sequenceargumento con el sujeto list. Específicamente, agrega cada uno de los elementos sequenceen orden de iteración.

un aparte

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

matrices

Agregué esto debido a la posible confusión que la respuesta anterior de Abel puede causar al mezclar la discusión sobre listas, secuencias y matrices. Arraysse agregaron a Python después de secuencias y listas, como una forma más eficiente de almacenar matrices de tipos de datos integrales. No confundir arrayscon lists. Ellos no son los mismos.

De los documentos de la matriz :

Las matrices son tipos de secuencia y se comportan de manera 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 mediante un código de tipo, que es un solo carácter.

Jade avatar Jul 03 '2013 03:07 Jade

appendestá agregando 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]
SilentGhost avatar Jan 07 '2010 16:01 SilentGhost

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)agrega el objeto ccualquiera que sea a la lista. En el caso, convierte a la propia lista en miembro de la lista.

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

Entonces, en realidad, estas son solo expresiones diferentes que se usan para hacer cosas diferentes por diseño.

Tendayi Mawushe avatar Jan 07 '2010 17:01 Tendayi Mawushe