Это ответ не на исходный вопрос (на который я думаю, что он получил адекватный ответ), а на многочисленные вопросы, которые были заданы в комментариях о семантике расширенного назначения (+=
и подобных операциях). 1002 *
В двух словах: Расширенное назначение работает по-разному для изменяемых типов, чем для неизменяемых.
str
, tuple
и числовые типы, среди прочего, являются неизменяемыми. Содержимое кортежа не может быть изменено после его создания, поэтому вы получаете следующее поведение:
>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)
str
имеет ту же семантику. По сути, a += b
эквивалентно a = a + b
, если a
является неизменным.
Большинство других типов, включая list
, являются изменяемыми. Содержимое списка может быть изменено на месте, и расширенное назначение делает именно это. Следовательно:
>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
Принимая во внимание, что если бы третья строка была заменена на a = a + [3, 4]
, новый список был бы создан и b
был бы [1, 2]
.
Для пользовательского класса семантика зависит от того, как он был реализован, но это то, как это должно быть сделано в соответствии с PEP 203.