Каким образом имя неизменяемого объекта, повторно связанного с результатом расширенного присваивания?
Для изменяемых объектов, например, если x = [1, 2, 3]
и y = [4, 5], то когда мы выполняем x + = y, он выполняется как x .__ iadd __ (y)
, который изменяет x
на место и повторно связывает имя x
к нему снова?
И как это работает, если x
неизменяем? Вот что в документации Python говорится о расширенных назначениях.
Если x является экземпляром класса, который не определяет метод
__ iadd __ ()
,x .__ add __ (y)
иy .__ radd __ (x)
, как и при оценкеx + y
.
Хорошо, теперь, если x = (1, 2, 3)
и y = (4, 5)
, когда мы делаем x + = y
, python выполняет x .__ add __ (y)
, который создает новый объект. Но когда и как этот новый объект получит отскок к x
?
Я изучил исходный код CPython, в частности объект кортеж
( tupleobject.c ) и AugAssign
части в Python-ast.c и ast.c , но не мог понять, как происходит повторное связывание.
РЕДАКТИРОВАТЬ : Удалены неправильные представления в исходном вопросе и заменены на форму вопроса, чтобы не вводить в заблуждение будущих читателей.