对返回map对象的函数使用列表推导访问属性结果为空的原因
问题原因解析
这个问题的根源是Python 3中map返回值的迭代器特性:
- Python 3的
map函数不会直接生成存储所有元素的列表,返回的是惰性迭代器对象,这类对象只能被遍历一次,遍历结束后内部指针会停在序列末尾,后续再次遍历不会返回任何元素,相当于被“消耗完”了。 - 你提到
video本身也是其他预处理逻辑返回的map对象,同样属于迭代器,也遵循一次性消耗的规则。
你遇到的空列表问题,本质是迭代器被提前消耗了,常见场景如下:
你在执行timestamps = [frame.timestamp for frame in preprocessed_video]之前,已经对preprocessed_video做过一次遍历操作(比如打印内容、统计长度、做其他数据处理等),第一次遍历已经把迭代器里的所有元素取完了,列表推导是第二次遍历,自然拿不到任何元素,得到空列表。
当你把返回值改成list(map(fun, video))时,相当于直接把迭代器的所有元素取出存入列表,列表是支持多次遍历的静态容器,不存在消耗的问题,所以列表推导可以正常拿到所有timestamp值。
可以用极简代码复现这个现象:
demo_iter = map(lambda x: x*2, [1,2,3]) # 第一次遍历迭代器 print(list(demo_iter)) # 输出 [2,4,6] # 第二次遍历已被消耗的迭代器 print(list(demo_iter)) # 输出 []
内容的提问来源于stack exchange,提问作者ledermauss
相关产品推荐
相关产品推荐

