Editar: (para abordar las cuestiones adicionales planteadas por las modificaciones a la pregunta):
a = a + b
y a += b
no son la misma operación. El primero ejecuta a.__add__(b)
, este último ejecuta a.__iadd__(b)
("in-place add").
La diferencia entre los dos es que el primero siempre crea un nuevo objeto (y vuelve a vincular el nombre a
con ese nuevo objeto) mientras que el segundo modifica el objeto in situ (si puede, y con una lista, puede)
Para ilustrar esto, basta con ver las direcciones de sus objetos:
>>> a = [1, 2]
>>> id(a)
34660104
>>> a = a + [a]
>>> id(a)
34657224
>>> id(a[2])
34660104
La "nueva" a
se construyó a partir de cero, primero tomando los valores de la lista de edad a
, a continuación, concatenando la referencia a la viejo objeto a eso.
Contraste esto:
>>> a = [1, 2]
>>> id(a)
34658632
>>> a += [a]
>>> id(a)
34658632
>>> id(a[2])
34658632
(respuesta de edad, que explican las referencias cíclicas):
Considere esto:
>>> a = [1, 2]; a += a
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a.extend(a)
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a += [a]
>>> a
[1, 2, [...]]
>>> a = [1, 2]; a.append(a)
>>> a
[1, 2, [...]]
tanto, para resumir la primera parte:
Para listas, a += a
es equivalente a llamar al a.extend(a)
que modifica a
en el lugar, agregando copias de los elementos encontrados en a
al comienzo de esta operación.
Por el contrario, a += [a]
corresponde a a.append(a)
, los cuales crean una referencia a la lista a
(i. E. Un puntero a su dirección en la memoria) y añadir que a la lista. Lo cual constituye una llamada "referencia cíclica".
Si se va a mirar a la representación interna de a
en ese punto, se vería algo como esto:
a: Reference to a list object at address 0xDEADBEEF
a[0]: Reference to the integer object "1"
a[1]: Reference to the integer object "2"
a[2]: Reference to the same list object at address 0xDEADBEEF
versiones antiguas de Python (pre-1.5.1) no eran lo suficientemente inteligente como para detectar que , por lo que si tuviera que hacer un print a
, obtendría [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, ...
etc. en un bucle infinito. Desde Python 1.5.1, el intérprete detecta esto, imprimiendo [1, 2, [...]]
en su lugar.
http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python – Dogbert
'a = [1, 2]; a + = a' hará '[1, 2, 1, 2]', no '[1, 2, [1, 2]'. Ver la pregunta duplicada – khachik
El llamado duplicado no discute las listas de elipsis * en absoluto *. – Marcin