大伙看下这是 Python3 的特性还是 bug?

2018-05-09 15:06:44 +08:00
 fankcoder
使用 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 之后就销毁值啊,我还要用啊。。。
2831 次点击
所在节点    Python
12 条回复
ipwx
2018-05-09 15:10:47 +08:00
invoke
2018-05-09 15:12:09 +08:00
这不是销毁了。。

建议楼主
test = map(lambda....)
for i in test
两次尝试一下
hourann
2018-05-09 15:21:38 +08:00
是新特性。generator 了解一下。python3 的很多迭代工具都改为惰性求值,意思是用到的时候再求值,而不是一次性算完了然后放在内存里。如果楼主不适应,可以外面加个 list,list(map(…)),就把所有值都求出来放到一个列表里了
fankcoder
2018-05-09 15:24:30 +08:00
感谢,之前没在意这个
orangeade
2018-05-09 15:26:54 +08:00
qianc1990
2018-05-09 16:20:11 +08:00
迭代器我知道, 可是为什么是这样子的呢?
shuizhengqi
2018-05-09 16:24:14 +08:00
迭代器只运行一次
suber
2018-05-09 16:57:38 +08:00
这是 Python3 的 map 不一样。2 返回的是一个 list ;而 3 是返回一个 iterator,并且这个结果是 yield 的。

https://docs.python.org/3/library/functions.html#map
congeec
2018-05-10 01:51:11 +08:00
注意生成器和迭代器不是一个东西
lfzyx
2018-05-10 10:05:52 +08:00
麻烦用列表推导来替代 map
lfzyx
2018-05-10 10:07:08 +08:00
test = [x for x in range(2)]
ArianX
2018-05-10 10:31:00 +08:00
这是生成器吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/453451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX