Доповнені заяви про призначення

Оновлено: 24.04.2023

Розширене присвоєння — це комбінація в одному операторі двійкової операції та оператора присвоєння:

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="

(Див. розділ Праймеріз для визначення синтаксису останніх трьох символів.)

Розширене призначення оцінює ціль (яка, на відміну від звичайних операторів призначення, не може бути розпаковуванням) і список виразів, виконує двійкову операцію, специфічну для типу призначення над двома операндами, і призначає результат вихідній цільовій цілі. Ціль оцінюється лише один раз.

Вираз розширеного присвоєння, як-от x += 1, можна переписати як x = x + 1, щоб досягти подібного, але не зовсім рівного ефекту. У доповненій версії x обчислюється лише один раз. Крім того, якщо можливо, фактична операція виконується на місці, тобто замість створення нового об’єкта та призначення його цільовому об’єкту змінюється старий об’єкт.

На відміну від звичайних завдань, розширені завдання оцінюють ліву сторону перед оцінкою правої сторони. Наприклад, a[i] += f(x) спочатку шукає a[i], потім обчислює f(x) і виконує додавання, і, нарешті, він записує результат назад до a[i].

За винятком призначення кортежам і декільком цілям в одному операторі, призначення, виконане доповненими операторами призначення, обробляється так само, як і звичайні призначення. Подібним чином, за винятком можливої поведінки на місці, двійкова операція, що виконується розширеним призначенням, є такою самою, як і звичайні двійкові операції.

Для цілей, які є посиланнями на атрибути, застосовується те саме застереження щодо атрибутів класу та екземпляра, що й для звичайних призначень.