Esta es una respuesta no a la pregunta original (que creo que ha sido respondida adecuadamente), sino a las numerosas preguntas que se han formulado en los comentarios sobre la semántica de la asignación aumentada (+=
y operaciones similares).
En pocas palabras: la asignación aumentada funciona de manera diferente para los tipos mutables que para los inmutables.
str
, tuple
, y los tipos numéricos, entre otros, son inmutables. El contenido de una tupla no se pueden cambiar una vez que se ha creado, por lo que obtener este comportamiento:
>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)
str
tiene la misma semántica. Básicamente, a += b
es equivalente a a = a + b
si a
es inmutable.
La mayoría de los otros tipos, incluido list
, son mutables.El contenido de una lista puede cambiarse en su lugar, y la asignación aumentada hace exactamente eso. Por lo tanto:
>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
Mientras que si la tercera línea se sustituyeron por a = a + [3, 4]
, una nueva lista se crea y se b
sería [1, 2]
.
Para una clase definida por el usuario, la semántica depende de la forma en que se llevó a cabo, pero así es como se supone que debe ser hecho por PEP 203.
¿Es este comportamiento todavía está presente en Python 3.x? Siempre me ha parecido irritante que un tipo de biblioteca estándar rompa el contrato general que 'a + = b' <=>' a = a + b' (sin afectar a ninguna otra referencia al valor 'a' original). –
@Karl Knechtel: lamentablemente, todavía está presente en Python 3.2.1. –
Lo estaba comprobando en python 3.2, sí. Encontré el problema mirando un código para principiantes que estaba produciendo resultados incorrectos. No pude encontrar ninguna referencia a este comportamiento específico en 'Learning Python'. Comprobé PEP203 y dice que se usa '__iadd__' pero también dicen que' __iadd__' es el in situ '__add__' que no es el caso en este caso ... Tal vez alguien podría explicar lo racional debajo de este comportamiento o punto/enlace a alguna discusión sobre eso? Entiendo por el comentario de Karl que hay personas preocupadas por eso – joaquin