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 не позволяет распределять назначение на месте по нескольким целям.