Операция составного присваивания, другое название "присваивание на месте" отличается от простоrо присваивания тем, что вместо знака равенства =
в ней используется составной оператор, представляющий собой комбинацию бинарного оператора и оператора =
.
Операции составного присваивания:
x += y
, работает аналогично x = x + y
x -= y
, работает аналогично x = x - y
x *= y
, работает аналогично x = x * y
x /= y
, работает аналогично x = x / y
x %= y
, работает аналогично x = x % y
x **= y
, работает аналогично x = x ** y
x //= y
, работает аналогично x = x // y
x @= y
, работает аналогично x = x @ y
В левой части составного присваивания допускается только одна целевая ссылка (переменная), множественные целевые ссылки (переменные) не поддерживаются.
При выполнении составного присваивания сначала вычисляется выражение справа. Затем Python вызывает специальный метод объекта _iadd_
для выполнения соответствующей бинарной операции на месте, передавая ему правую часть в качестве аргумента. Если такой метод не предусмотрен, то выполняется простое присваивание
Например, инструкция x += у
выполняется как инструкция x = x._iadd_(у)
, если для x
предусмотрен специальный метод _iadd_
. Если же такой метод не предусмотрен, то инструкция x += у
выполняется как инструкция x = x + y
.
Операция составного присваивания никогда не создает свою целевую ссылку. К моменту ее выполнения целевая ссылка должна существовать. Составное присваивание может повторно связать целевую ссылку с другим объектом или изменить тот объект, с которым она уже была связана. Простое присваивание может создавать целевую ссылку или повторно связывать ее, но никогда не изменяет объект, с которым она до этого была связана, если таковой имеется. В данном случае различие между объектами и ссылками на объекты играет ключевую роль. Например, операция x = x + y
не изменяет объект, с которым первоначально было связано имя x
. Вместо этого она изменяет связывание имени x
таким образом, чтобы оно ссылалось на новый объект.
>>> x = 3 >>> print(x) # 3 >>> x += 2 >>> print(x) # 5 >>> x -= 1 >>> print(x) # 4 >>> x *= 2 >>> print(x) # 8 >>> x /= 3 >>> print(x) # 2.6666666666666665 >>> x %= 2 >>> print(x) # 0.6666666666666665 >>> x **= 3 >>> print(x) # 0.2962962962962961 >>> x //= 3 >>> print(x) # 0.0 >>> x = 4 >>> x //= 2.1 >>> print(x) # 1.0 >>> x = 4 >>> x //= 1.9 >>> print(x) # 2.0 >>>