Как операторы на месте Python отличаются от стандартных операторных функций? - PullRequest
12 голосов
/ 23 января 2011

Почему operator.iadd(x, y) не эквивалентно z = x; z += y? И чем operator.iadd(x, y) отличается от operator.add(x, y)?

Из документов :

Многие операции имеют «на месте» версия. Следующие функции обеспечить более примитивный доступ к операторы на месте, чем обычно синтаксис делает; например, утверждение х + = у эквивалентно х = operator.iadd (x, y). Еще один способ скажем так, что г = operator.iadd (x, y) эквивалентен составное утверждение z = x; z + = y.

Смежный вопрос , но меня не интересуют методы класса Python; просто обычные операторы на встроенных типах Python.

Ответы [ 2 ]

27 голосов
/ 23 января 2011

Во-первых, вам нужно понять разницу между __add__ и __iadd__.

Метод __add__ объекта является обычным дополнением: он принимает два параметра, возвращает их сумму и не изменяет ни один из параметров.

Метод __iadd__ объекта также принимает два параметра, но вносит изменения на месте, изменяя содержимое первого параметра. Поскольку для этого требуется мутация объекта, неизменяемые типы (например, стандартные числовые типы) не должны иметь метод __iadd__.

a + b использует __add__. a += b использует __iadd__, если он существует; если это не так, он эмулирует это через __add__, как в tmp = a + b; a = tmp. operator.add и operator.iadd отличаются одинаково.

На другой вопрос: operator.iadd(x, y) не эквивалентен z = x; z += y, потому что если __iadd__ не существует, вместо него будет использоваться __add__. Вам необходимо присвоить значение, чтобы гарантировать, что результат сохраняется в обоих случаях: x = operator.iadd(x, y).

Вы сами можете это легко увидеть:

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']
0 голосов
/ 23 января 2011

Возможно, потому что некоторые объекты Python являются неизменяемыми.

Я предполагаю, что operator.iadd(x, y) эквивалентно z = x; z += y только для изменяемых типов, таких как словари и списки, но не для неизменяемых типов, таких как числа и строки.

...