python python-3.x list concatenation

Concatenación usando el operador+y+= en Python



python-3.x list (1)

La idea básica es que los operadores + y += no son necesariamente la misma operación en Python, y de hecho son diferentes para las listas. La operación + se realiza mediante el método mágico __add__ , mientras que la operación += se realiza mediante el método mágico __iadd__ (agregar en el lugar). Estos métodos mágicos provienen del tipo a la izquierda del operador.

La adición in situ para una lista no requiere una lista en el lado derecho, solo una iterable. Luego, los elementos se toman uno por uno del iterable y se anexan a la lista. Esto es similar al método de extend la lista. Así que el operador += no descuida el tipo de objeto a la derecha, solo extiende los tipos posibles que pueden usarse.

Este comportamiento es algo confuso; debe ser así, ya que usted es la segunda persona en dos días que he visto hacer una pregunta similar (pero no duplicada) sobre este tema. Sin embargo, este comportamiento es conveniente: ahora tenemos una manera fácil de combinar una lista con cualquier iterable.

Para más información sobre esto, vea ¿Por qué las listas de Python le permiten + = una tupla, cuando no puede + una tupla? .

Como dice el comentario de @khelwood, el tipo resultante para a += b es obvio: el tipo de a . Así que el tipo de b puede ser flexible. El tipo resultante de a + b no es obvio. Python es un lenguaje estrictamente tipado y odia tal ambigüedad. El Zen de los estados de Python

Explícito es mejor que implícito.

y

Ante la ambigüedad, rechace la tentación de adivinar.

y

Aunque la practicidad supera a la pureza.

Así que el comportamiento actual encaja bastante bien con el Zen de Python. Observo que no hay nada en el Zen sobre la consistencia.

Recientemente, he notado una inconsistencia al concatenar listas.

Entonces, si uso el operador + , no concatena la lista con ningún objeto de diferente tipo. P.ej.,

l = [1,2,3] l = l + (4,5) #TypeError: can only concatenate list (not "tuple") to list

Pero, si uso el operador + = , se descuida el tipo de objeto. P.ej.,

l = [1,2,3] l += "he" #Here, l becomes [1, 2, 3,"h", "e"] l += (56, 67) #Here, l becomes [1, 2, 3,"h", "e", 56, 67]

Entonces, ¿es sólo la semántica del lenguaje o alguna otra razón?