Cuál es la diferencia entre:
some_list1 = []
some_list1.append("something")
y
some_list2 = []
some_list2 += ["something"]
Cuál es la diferencia entre:
some_list1 = []
some_list1.append("something")
y
some_list2 = []
some_list2 += ["something"]
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Respuestas:
En su caso, la única diferencia es el rendimiento: agregar es dos veces más rápido.
En el caso general
append
, agregará un elemento a la lista, mientras+=
que copiará todos los elementos de la lista del lado derecho en la lista del lado izquierdo.Actualización: análisis de rendimiento
Comparando códigos de bytes podemos suponer que la
append
versión desperdicia ciclos enLOAD_ATTR
+CALL_FUNCTION
, y + = versión - enBUILD_LIST
. AparentementeBUILD_LIST
pesa más queLOAD_ATTR
+CALL_FUNCTION
.Podemos mejorar el rendimiento aún más eliminando los
LOAD_ATTR
gastos generales:fuente
append
vs+=
, entonces debe incluir la creación de la lista como parte de la medición. De lo contrario, sería una pregunta diferente (extend
vs+=
).En el ejemplo que dio, no hay diferencia, en términos de producción, entre
append
y+=
. Pero hay una diferencia entreappend
y+
(sobre la que se preguntó originalmente).Como puede ver,
append
y+=
tiene el mismo resultado; agregan el elemento a la lista, sin producir una nueva lista. Utilizando+
agrega las dos listas y produce una nueva lista.fuente
append
agrega una entrada a la lista, mientras que + = agrega tantas como haya en la otra lista (es decir, alias aextend
). Pero eso ya lo sabe, a juzgar por la forma en que se escribió la pregunta. ¿Hay alguna otra diferencia que me falta?Vea que append agrega un solo elemento a la lista, que puede ser cualquier cosa.
+=[]
se une a las listas.fuente
+ = es una tarea. Cuando lo usas, realmente estás diciendo 'alguna_lista2 = alguna_lista2 + [' algo ']'. Las asignaciones implican volver a enlazar, por lo que:
El operador + = también debería normalmente crear un nuevo objeto de lista como lo hace normalmente list + list:
Sin embargo, en realidad:
Esto se debe a que las listas de Python implementan __iadd __ () para hacer un cortocircuito de asignación aumentada + = y llamar a list.extend () en su lugar. (Es un poco extraño esto: generalmente hace lo que querías decir, pero por razones confusas).
En general, si está agregando / extendiendo una lista existente y desea mantener la referencia a la misma lista (en lugar de hacer una nueva), es mejor ser explícito y seguir con append () / extend () métodos.
fuente
es en realidad
por un valor, no hay diferencia. La documentación establece que:
Así, obviamente,
s.append(x)
es lo mismo ques.extend([x])
fuente
La diferencia es que concatenar aplanará la lista resultante, mientras que añadir mantendrá los niveles intactos:
Entonces, por ejemplo, con:
Usando append, terminas con una lista de listas:
Al usar concatenar en su lugar, terminas con una lista plana:
fuente
Las pruebas de rendimiento aquí no son correctas:
p.ej
buenas pruebas se pueden encontrar aquí: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
fuente
+= [one_var]
. Si omitimos la creación de listas, + = se convierte en la opción más rápida.Además de los aspectos descritos en las otras respuestas, agregar y + [] tienen comportamientos muy diferentes cuando intentas crear una lista de listas.
list1 + ['5', '6'] agrega '5' y '6' a list1 como elementos individuales. list1.append (['5', '6']) agrega la lista ['5', '6'] a list1 como un solo elemento.
fuente
El comportamiento de reenlace mencionado en otras respuestas es importante en ciertas circunstancias:
Esto se debe a que la asignación aumentada siempre se vuelve a enlazar, incluso si el objeto se mutó en el lugar. La revinculación aquí resulta ser
a[1] = *mutated list*
, que no funciona para tuplas.fuente
tomemos un ejemplo primero
fuente
El método append () agrega un solo elemento a la lista existente
Así que aquí se modificará some_list1.
Actualizado:
Mientras que se usa + para combinar los elementos de las listas (más de un elemento) en la lista existente de forma similar a la extensión (corregida por Flux ).
Así que aquí some_list2 y ["algo"] son las dos listas que se combinan.
fuente
+=
no devuelve una nueva lista. El FAQ de programación dice: "... para listas,__iadd__
es equivalente a llamarextend
a la lista y devolver la lista. Por eso decimos que para listas,+=
es una" abreviatura "delist.extend
". También puede ver esto por sí mismo en el código fuente de CPython: github.com/python/cpython/blob/v3.8.2/Objects/…"+" no cambia la lista
.append () muta la lista anterior
fuente