Python append() versus operador + en listas, ¿por qué dan resultados diferentes? [duplicar]
¿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 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 array.append
operació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 append
mé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 append
al +
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 array
s también se aplica a las listas:
- El
+
operador concatena dos listas juntas. El operador devolverá un nuevo objeto de lista. List.append
no agrega una lista con otra, sino que agrega un solo objeto (que aquí es unlist
) al final de su lista actual.c
Por lo tanto, sumarse a sí mismo conduce a una recursividad infinita.- Al igual que con las matrices, puede usar
List.extend
para agregar extender una lista con otra lista (oiterable
). 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.
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 mutator
on list
que agrega su object
argumento único (en su ejemplo específico, la lista c
) al asunto list
. En su ejemplo, esto da como resultado c
agregar 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 sequence
argumento con el sujeto list
. Específicamente, agrega cada uno de los elementos sequence
en orden de iteración.
un aparte
Al ser un operador, +
devuelve el resultado de la expresión como un nuevo valor. mutator
Al 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.
Arrays
se 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 arrays
con 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.
append
está 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]
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 c
cualquiera que sea a la lista. En el caso, convierte a la propia lista en miembro de la lista.
La expresión c += c
suma 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.