), как если бы присваивался новый объект?
Более конкретно:
Почему Python не проверяет, остается ли идентификатор объекта неизменным, и не пропускает присвоение в этом случае?
Это просто компромисс между производительностью или сложностью реализации для случая, который редко встречается на практике, или есть более фундаментальная причина?
[b]Контекст[/b] В книге Fluent Python (2-е изд.) Лучано Рамальо в примере 2–16 показано, что: [code]>>> t = (1, 2, [30, 40]) >>> t[2] += [50, 60] [/code] результат: [list] [*][code]t[/code] становится (1, 2, [30, 40, 50, 60]) [*]возникает ошибка TypeError: TypeError: объект 'tuple' не поддерживает назначение элементов [/list] Рамальо объясняет (насколько я понимаю), что расширенное присваивание выполняется примерно в следующие шаги: [list] [*]Загрузка t[2] на вершину стека ([code]TOS[/code]). [*]Выполните TOS += [50, 60]. Это удается, поскольку TOS ссылается на изменяемый объект (список). [*]Попытайтесь вернуть результат с помощью t[2] = TOS. Это не удается, поскольку t является неизменяемым (кортеж). [/list] [b]Вопрос[/b] Для списка l операция: [code]l += [50, 60][/code] изменяет список на месте и [b]не[/b] меняет его идентичность ([code]id(l)[/code] остается прежним). Учитывая это, почему интерпретатор все еще пытается выполнить шаг 3 ([code]t[2] = TOS[/code]), как если бы присваивался новый объект? Более конкретно: [list] [*]Почему Python не проверяет, остается ли идентификатор объекта неизменным, и не пропускает присвоение в этом случае?
[*]Это просто компромисс между производительностью или сложностью реализации для случая, который редко встречается на практике, или есть более фундаментальная причина?