filter()函数两次输出结果不一致?

新人刚接触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)
阅读 1.4k
1 个回答

你要理解迭代器对象并不等同与列表对象,虽然其可以用list来转换为列表,但这种转换是一次性的。

filter在python2中返回列表,在python3中返回迭代器对象,根据你的问题,你应该是在python3下运行的。

其实你可以这样认识,迭代器对象初始化后是一个指向一个队列第一个位置的,迭代完成后(用list转换处理后),指向了末尾,其后因为已经没有实际数据了,所以重复使用list来处理一个迭代器对象,只有第1次可以正确获得结果,其后都是返回空列表。

如果你想重复使用转换后的列表,你应该直接把这个结果存储起来,而不是再用list去转换迭代器.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题