Python увеличивает несколько встроенных переменных

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

>> 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

2 ответов


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

со ссылкой на расширенная документация назначения:

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

выделено мной.

дополненное назначение на месте переводится с target -= expression to 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)))

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

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