Проблема здесь на самом деле не в том, как итераторы работают в python, а в том, как присваивание работает на большинстве типов python.Когда спрашивающий пытается перезаписать значение lett, которое действительно является псевдонимом ab [index] и должно казаться, что оно работает логически, на самом деле это не то, что происходит, а lett (ссылка или указатель lett, а не значение, на которое он указываетto) переназначается, чтобы указывать на константу его нового значения, это сильно отличается от перезаписи байтов в той области памяти, на которую она указывает.Этот способ работы необходим для того, чтобы позволить пиктографической типизации утки работать, когда имя переменной со временем может указывать на разные типы с разными размерами.Пожалуйста, смотрите эту страницу для более подробного объяснения того, что здесь происходит: http://gestaltrevision.be/wiki/python/aliases
Наиболее близким, что мы могли бы достичь, является ручной тип 'mutable integer', который позволит изменять его базовое значение в отличие от интонов Python.Однако нет смысла проходить здесь это вручную, как уже объяснено в этом вопросе .Хотя вопрос совершенно другой, это одна и та же основная проблема, и решение в равной степени приемлемо.Однако, если вы делаете это, я бы сначала подумал, можете ли вы реструктурировать свой код, чтобы избежать этого, во-первых, так как это довольно опасный и подверженный случайностям способ работы.
Вот пример из anответьте на вопрос "increment int object" для полного объяснения того, как взломать это вместе, см. вопрос, связанный выше, обратите внимание, что этот пример включает только уменьшение, другие операторы должны бытьреализован так же:
import sys
class FakeInt(int):
def __init__(self, *arg, **kwarg):
self._decr = False
int.__init__(self, *arg, **kwarg)
def __neg__(self):
if self._decr:
upLocals = sys._getframe(1).f_locals
keys, values = zip(*upLocals.items())
i = list(values).index(self)
result = FakeInt(self-1)
upLocals[keys[i]]=result
return result
self._decr = not self._decr
return self