Как имя неизменяемого объекта повторно связывается с результатом расширенного присваивания?

Каким образом имя неизменяемого объекта, повторно связанного с результатом расширенного присваивания?

Для изменяемых объектов, например, если 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 , но не мог понять, как происходит повторное связывание.

РЕДАКТИРОВАТЬ : Удалены неправильные представления в исходном вопросе и заменены на форму вопроса, чтобы не вводить в заблуждение будущих читателей.

5
задан Praveen Gollakota 20 January 2012 в 16:09
поделиться