我要替换此列表中的datetime对象:
a = [
[datetime.date(2019,1,1), 100],
[datetime.date(2019,1,2), 187],
]
所以我创建了这个函数:
def date_to_iso(rows):
for line in rows:
for item in line:
if isinstance(item, datetime.date):
item = item.date().isoformat()
return tempL
有人可以告诉我为什么这个功能没有更改列表吗?
答案 0 :(得分:0)
当您分配回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]