pyplot python list append nested-lists

pyplot - Python anexa() vs.+operador en listas, ¿por qué dan resultados diferentes?



title plt python (7)

¿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 recursión infinita. c[-1] c son lo mismo. ¿Por qué es diferente con la operación + ?


Para explicar "por qué":

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

La diferencia aquí es que la operación + actúa de manera específica cuando agrega una matriz (está sobrecargada como otras, consulte este capítulo sobre secuencias) al concatenar el elemento. Sin embargo, el método de apéndice hace literalmente lo que usted pregunta: añada el objeto en el lado derecho que le da (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 forma similar al operador + (como otros han mostrado aquí también). No es aconsejable hacer lo contrario: intentar imitar anexar con el operador + para listas (ver 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 después de que aparecieron las secuencias y las listas.


El método que estás buscando es extend() . De la documentation 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).


El operador de concatenación + es un operador 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.append() que agrega su argumento de object único (en su ejemplo específico, la lista c ) a la list.append() temas. En su ejemplo, esto resulta en que c agrega una referencia a sí mismo (de ahí la recursión infinita).

Una alternativa a la concatenación ''+''

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

Un lado

Siendo un operador, + devuelve el resultado de la expresión como un nuevo valor. Siendo un método de mutator no encadenado, list.append() modifica la lista de temas in situ y no devuelve nada.

Arrays

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

De los array la array :

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 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 en 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, hace que la 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 en la primera lista y los elementos en la segunda lista.

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


Ver list.append() :

list.append (x)

  • Agregue un artículo al final de la lista; equivalente a a [len (a):] = [x].

list.extend (L) - Extiende la lista añadiendo todos los elementos en la lista dada; equivalente a a [len (a):] = L.

c.append(c) "se agrega" c a sí mismo como un elemento . Como una lista es un tipo de referencia, crea una estructura de datos recursiva.

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


deberías usar extender ()

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

otra información: añadir vs. extender


append agrega un elemento a una lista. si desea extender la lista con la nueva lista, debe usar extend .

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