新人刚接触python,学到迭代器这里发现一个奇怪的问题,为什么两次输出的列表不一致?
def is_even(num):
"""
过滤偶数
"""
return num % 2 == 0
def square(num):
"""
求平方值
"""
return num ** 2
numbers1 = [35, 12, 8, 99, 60, 52]
filter1 = filter(is_even, numbers1)
print(f'第一次:{list(filter1)}') # [12, 8, 60, 52]
print(filter1)
print(f'第二次:{list(filter1)}') # []
print(filter1)
你要理解迭代器对象并不等同与列表对象,虽然其可以用
list
来转换为列表,但这种转换是一次性的。而
filter
在python2中返回列表,在python3中返回迭代器对象,根据你的问题,你应该是在python3下运行的。其实你可以这样认识,迭代器对象初始化后是一个指向一个队列第一个位置的,迭代完成后(用
list
转换处理后),指向了末尾,其后因为已经没有实际数据了,所以重复使用list
来处理一个迭代器对象,只有第1次可以正确获得结果,其后都是返回空列表。如果你想重复使用转换后的列表,你应该直接把这个结果存储起来,而不是再用
list
去转换迭代器.