¿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?
python
list
append
nested-lists
ooboo
fuente
fuente
+=
: stackoverflow.com/questions/725782/…Respuestas:
Para explicar "por qué":
La
+
operación agrega los elementos de la matriz a la matriz original. Laarray.append
operación inserta la matriz (o cualquier objeto) al final de la matriz original, lo que da como resultado una referencia a sí mismo en ese lugar (de ahí la recursividad infinita).La diferencia aquí es que la operación + actúa de manera 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 append hace literalmente lo que le 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
Úselo
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 anexar con el operador + para listas (consulte mi enlace anterior sobre por qué).Poca historia
Para divertirse, un poco de historia: el nacimiento del módulo de arreglos en Python en febrero de 1993. Puede que te sorprenda, pero los arreglos se agregaron mucho después de que aparecieran las secuencias y listas.
fuente
+
ser simétricas: concatenar lista con lista.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. Ellist.append()
método es unmutator
en ellist
que agrega su únicoobject
argumento (en su ejemplo específico, la listac
) al temalist
. En su ejemplo, esto da como resultado que sec
agregue una referencia a sí mismo (de ahí la recursividad infinita).Una alternativa a la concatenación '+'
El
list.extend()
método es también un método mutador que concatena susequence
argumento con el sujetolist
. Específicamente, agrega cada uno de los elementos desequence
en orden de iteración.Un aparte
Al ser un operador,
+
devuelve el resultado de la expresión como un nuevo valor. Al ser unmutator
método no encadenado ,list.extend()
modifica la lista de temas en el lugar y no devuelve nada.Matrices
Agregué esto debido a la posible confusión que la respuesta de Abel anterior puede causar al mezclar la discusión de listas, secuencias y matrices.
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 confundaarrays
conlists
. Ellos no son los mismos.De los documentos de la matriz :
Las matrices son tipos de secuencia y se comportan de manera muy parecida 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.
fuente
append
es agregar un elemento a una lista. si desea ampliar la lista con la nueva lista que necesita utilizarextend
.fuente
+
yextend
produjera resultados diferentes, tendríamos algo en qué pensar.append
y+
son diferentes. Es por eso. Me gusta esta respuesta porque ofrece qué hacer que tiene más sentido.__lt__
no se puede sobrecargar en Python (hoy en día sí). Las preguntas por qué son las más esenciales, pero a menudo las más difíciles de responder: piden la esencia, no un puntero al manual. Y por supuesto: si no le gusta una pregunta (a mí no me gusta la mayoría), entonces no responda ;-)c += [c]
yc.append(c[:])
también.a+b != a*b
? Son operaciones diferentes. Esa es la respuesta. "Por qué" no es tan útil como otras preguntas, como "¿Cómo puedo agregar correctamente?" O "¿Qué tiene de malo este apéndice que conduce a la recursividad infinita?" Preguntas del formulario "¿Qué le hago a X" o "Qué salió mal cuando hice X"? O "¿Qué debo hacer en lugar de X?" También ayudará a alguien a aprender, pero proporcionará respuestas enfocadas, utilizables y procesables.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 objetoc
a la lista. En el caso de que haga que la propia lista sea miembro de la lista.La expresión
c += c
suma dos listas juntas y asigna el resultado a la variablec
. El+
operador sobrecargado se define en las listas para crear una nueva lista cuyo contenido son los elementos de la primera lista y los elementos de la segunda lista.Entonces, estas son realmente diferentes expresiones que se usan para hacer diferentes cosas por diseño.
fuente
El método que estás buscando es
extend()
. De la documentación de Python :fuente
deberías usar extend ()
otra información: agregar vs. extender
fuente
Ver la documentación :
c.append(c)
"añade" 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 aextend(c)
, que añade los elementos de c a c.fuente