Python3 中这是特性还是 bug?

使用 python3.6.5

>>> test = map(lambda x:x ,range(2))
>>> test
<map object at 0x7f423167bf98>
>>> print(tuple(test))
(0, 1)
>>> print(tuple(test))
()
>>> print(tuple(test))
()
第一 print 之后,值就被销毁了


在 python2.7 下
>>> test = map(lambda x:x ,range(2))
>>> print tuple(test)
(0, 1)
>>> print tuple(test)
(0, 1)
>>> print tuple(test)
(0, 1)
>>>
print 的之后值也一直存在

python3 这是神码特性,难道是 bug??没理由在我 print 之后就销毁值啊,我还要用啊。。。
Python3 中这是特性还是 bug?


12 回复

这不是销毁了。。

建议楼主
test = map(lambda…)
for i in test
两次尝试一下

是新特性。generator 了解一下。python3 的很多迭代工具都改为惰性求值,意思是用到的时候再求值,而不是一次性算完了然后放在内存里。如果楼主不适应,可以外面加个 list,list(map(…)),就把所有值都求出来放到一个列表里了

感谢,之前没在意这个

迭代器我知道, 可是为什么是这样子的呢?

迭代器只运行一次

这是 Python3 的 map 不一样。2 返回的是一个 list ;而 3 是返回一个 iterator,并且这个结果是 yield 的。

https://docs.python.org/3/library/functions.html#map

注意生成器和迭代器不是一个东西

麻烦用列表推导来替代 map

test = [x for x in range(2)]

这是生成器吧

回到顶部