首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

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

  •  1
     
  •   fankcoder · 2018-05-09 15:06:44 +08:00 · 1974 次点击
    这是一个创建于 404 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 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 之后就销毁值啊,我还要用啊。。。
    12 回复  |  直到 2018-05-10 10:31:00 +08:00
        2
    invoke   2018-05-09 15:12:09 +08:00   ♥ 1
    这不是销毁了。。

    建议楼主
    test = map(lambda....)
    for i in test
    两次尝试一下
        3
    hourann   2018-05-09 15:21:38 +08:00 via iPhone
    是新特性。generator 了解一下。python3 的很多迭代工具都改为惰性求值,意思是用到的时候再求值,而不是一次性算完了然后放在内存里。如果楼主不适应,可以外面加个 list,list(map(…)),就把所有值都求出来放到一个列表里了
        4
    fankcoder   2018-05-09 15:24:30 +08:00
    感谢,之前没在意这个
        5
    orangeade   2018-05-09 15:26:54 +08:00 via Android
        6
    qianc1990   2018-05-09 16:20:11 +08:00
    迭代器我知道, 可是为什么是这样子的呢?
        7
    shuizhengqi   2018-05-09 16:24:14 +08:00
    迭代器只运行一次
        8
    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
        9
    congeec   2018-05-10 01:51:11 +08:00 via iPhone
    注意生成器和迭代器不是一个东西
        10
    lfzyx   2018-05-10 10:05:52 +08:00
    麻烦用列表推导来替代 map
        11
    lfzyx   2018-05-10 10:07:08 +08:00
    test = [x for x in range(2)]
        12
    ArianX   2018-05-10 10:31:00 +08:00 via Android
    这是生成器吧
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   997 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 21ms · UTC 19:04 · PVG 03:04 · LAX 12:04 · JFK 15:04
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1