когда вы присваиваете обратно item
, вы просто повторно используете имя item
, но старая ссылка «потеряна».Вместо этого назначьте исходный список с индексом (используя идиоматический метод с enumerate
, чтобы получить индекс и элемент:
def date_to_iso(rows):
for line in rows:
for i,item in enumerate(line):
if isinstance(item, datetime.date):
line[i] = item.date().isoformat()
, этот код использует item
только для чтения, пока не потребуетсязамените его в исходном списке.
Обратите внимание, что line[i] = ...
по-прежнему использует оригинальный объект line
, поэтому он работает.
Другим способом было бы использование списка для полной перестройки.данные, которые потребовали бы назначения среза для rows[:]
для имитации изменения на месте для rows
:
def date_to_iso(rows):
rows[:] = [[item.date().isoformat() if isinstance(item, datetime.date)
else item for item in line] for line in rows]