Python 3中的过滤器对象错误

5
当我在Python 3中运行这段代码时:
languages = ["HTML", "JavaScript", "Python", "Ruby"]
print( filter(lambda x: x == "Python",languages))

I get this error:

filter object at 0x7fd83ff0
filter object at 0x7feede10

我不知道这个错误的含义 - 在Python 2.7中它可以正常运行。

有人能提供一个解决方案吗?

1个回答

8
这不是错误——你打印了一个过滤器对象,因为filter()不返回列表——它构造了一个迭代器,但仅在请求时才这样做。
最简单的解决方案是使用函数list()——它请求一个迭代器并返回列表
print( list(filter(lambda x: x == "Python", languages)))

取代你的命令

print( filter(lambda x: x == "Python",languages))

注意: 这类似于打印range(10) (一个对象)并打印list(range(10)) (一个列表)。

在几乎所有返回list的函数中,Python 2.xPython 3.x之间存在差异 - 在Python 3.x中,它们返回更通用且占用更少内存的内容,如在所需情况下获取元素的方法

比较:1, 2, 3, 4, 5, 6, 7, 8, 9从1到9的整数(或1、2、...,9)。
没有区别吗?试着写出 从1到999999的所有整数


非常感谢,非常清晰。所以这个消息是迭代器的内存地址吗? - Jose Maria
几乎正确 - filter 对象本身的内存地址(只有在需要时才生成 iterator 对象)。这是大多数对象打印的常见方式。 - MarianD
我已经投票了,但我的等级只有5分,所以该网站不会考虑我的投票,但我非常感激和满意您的出色回答,一旦我获得更多积分(至少15分),我会再次投票给您。 - Jose Maria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接