¿En qué se diferencian las funciones del operador en el lugar de Python de las funciones del operador estándar?

¿Por qué no es operator.iadd(x, y) equivalente a z = x; z += y z = x; z += y ? ¿ Y en qué se diferencia operator.add(x, y) de operator.add(x, y) ?

De los documentos :

Muchas operaciones tienen una versión “in situ”. Las siguientes funciones proporcionan un acceso más primitivo a los operadores en el lugar que la syntax habitual; por ejemplo, la statement x + = y es equivalente a x = operator.iadd (x, y). Otra forma de decirlo es decir que z = operator.iadd (x, y) es equivalente a la statement compuesta z = x; z + = y.

Pregunta relacionada , pero no estoy interesado en los métodos de clase Python; solo operadores regulares en tipos Python incorporados.

Primero, necesitas entender la diferencia entre __add__ y __iadd__ .

El método __add__ un objeto es una adición regular: toma dos parámetros, devuelve su sum y no modifica ninguno de los parámetros.

El método __iadd__ un objeto también toma dos parámetros, pero realiza el cambio en el lugar, modificando el contenido del primer parámetro. Debido a que esto requiere la mutación de objetos, los tipos inmutables (como los tipos de números estándar) no deberían tener un método __iadd__ .

a + b usa __add__ . a += b usa __iadd__ si existe; si no lo hace, lo emula a través de __add__ , como en tmp = a + b; a = tmp tmp = a + b; a = tmp . operator.add y operator.iadd difieren de la misma manera.

A la otra pregunta: operator.iadd(x, y) no es equivalente a z = x; z += y z = x; z += y , porque si no existe __add__ , se utilizará __add__ su lugar. Debe asignar el valor para asegurarse de que el resultado se almacena en ambos casos: x = operator.iadd(x, y) .

Puedes ver esto tú mismo fácilmente:

 import operator a = 1 operator.iadd(a, 2) # a is still 1, because ints don't have __iadd__; iadd returned 3 b = ['a'] operator.iadd(b, ['b']) # lists do have __iadd__, so b is now ['a', 'b'] 

Tal vez porque algunos objetos de Python son inmutables.

Supongo que operator.iadd(x, y) es equivalente a z = x; z += y z = x; z += y solo para tipos mutables como diccionarios y listas, pero no para tipos inmutables como números y cadenas.