Python дополняет несколько переменных inline

Почему эта работа

>> x, y = (1, 2)
>> print x, y
1 2

Но увеличение результатов при синтаксических ошибках.

>> x, y -= (1, 2)
SyntaxError: illegal expression for augmented assignment

Есть ли другой способ, я ожидал:

>> x, y -= (1, 2)
>> print x, y
0 0

Ответ 1

Вы не можете использовать расширенный оператор присваивания для нескольких целей, нет.

Цитирование дополненной документации присваивания:

За исключением назначения кортежей и нескольких целей в одном утверждении, назначение, выполняемое расширенными операторами присваивания, обрабатывается так же, как и обычные назначения. Аналогично, за исключением возможного поведения на месте, двоичная операция, выполняемая дополненным назначением, такая же, как и обычные двоичные операции.

Акцент на мой.

Расширенное назначение на месте переводится с target -= expression в target = target.__isub__(expression) (с соответствующими крючками __i...__ для каждого оператора) и перевод этой операции на несколько целей не поддерживается.

Под капотом расширенное назначение - это специализация двоичных операторов (+, *, - и т.д.), не назначения. Поскольку реализация основана на этих операторах, а бинарные операторы имеют только два операнда, несколько целевых объектов никогда не включались в исходное предложение .

Вам нужно просто применить назначения отдельно:

x -= 1
y -= 2

или, если вы действительно хотите запутаться, используйте модуль operator и zip(), чтобы применить operator.isub к комбинациям (через itertools.starmap(), затем используйте назначение кортежей:

from operator import sub
from itertools import starmap

x, y = starmap(operator.isub, zip((x, y), (1, 2)))

где isub будет гарантировать, что правый хук вызван, позволяя вычитать на месте для изменяемых типов, которые его поддерживают.

или, если вы манипулируете типами, которые не поддерживают манипуляции на месте, достаточно использовать выражение генератора:

x, y = (val - delta for val, delta in zip((x, y), (1, 2)))

Ответ 2

Это x, y = (1, 2) - назначение последовательности. Он полагается, что правая сторона является итерируемым объектом, а левая сторона состоит из того же числа переменных, что и итерация левой стороны.

Этот x, y -= (1, 2) пытается вызвать метод __isub__ в левом операнде (-ях). Характер назначения на месте ( "расширенное" ) заключается в том, что он должен принимать переменную с левой стороны, значение которой получает операторский вызов, а затем переменная получает результат этого вызова. Python не позволяет распределять назначение на месте по нескольким целям.