python3过滤后列表内容消失的原因是什么?

What is the reason for list content disappears after filter in python3?

我正在使用 python 3.6.9.

自版本 3.x 起,内置函数 filter() returns 一个可迭代的过滤器对象,而不是列表。在第一个示例中,我在列表中使用连续过滤器,而不是将过滤器对象强制转换为列表:

>>> test1 = lambda n: n%2
>>> test2 = lambda n: n%3
>>>
>>> my_list = [1, 2, 3, 4, 5]
>>> filtered1 = filter(test1, my_list)
>>> filtered2 = filter(test2, filtered1)

这样,filtered2 产生了 1 和 5,这是我们想要的。在第二个示例中,我尝试用过滤后的可迭代对象覆盖 my_list 变量,然后以相同的方式继续下一个过滤器。

>>> my_list = [1, 2, 3, 4, 5]
>>> my_list = filter(test1, my_list)
>>> my_list = filter(test2, my_list)

my_list 在第二行产生 1、3、5,如预期的那样。然而,第三行的my_list是空的。

>>> list(my_list)
[]

关于过滤器状态的文档:

Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item))

所以我试了一下:

>>> my_list = [1, 2, 3, 4, 5]
>>> my_list = (item for item in my_list if test1(item))
>>> my_list = (item for item in my_list if test2(item))

这样,my_list 最后会得到 1, 5,所以不等价。 是什么导致第二个例子中my_list的内容消失了?

It seems like when you implemented method 2 where you tried to overwrite my_list variable with filter()'s result; when you checked for value of my_list in step2, you exhausted your iterator my_list.

Then in step3 you were passing empty iterator to filter method and thus the output iterator was empty as well.

下面,我尝试在不耗尽列表变量的情况下实现相同的方法并获得所需的输出。

>>> a = [1,2,3,4,5,6]
>>> a = filter(test1, a)
>>> a = filter(test2, a)
>>> f(a)
1
5
>>> f(a)
>>>

f() 只是一个打印迭代器的函数。 请注意我第一次使用 f(a) 循环遍历迭代器是如何耗尽它的。 下次我尝试这样做时,迭代器是空的。

>>> def f(obj):
...     for i in obj:
...             print(i)
...