V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
fankcoder
V2EX  ›  Python

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

  •  1
     
  •   fankcoder ·
    fankcoder · 2018-05-09 15:06:44 +08:00 · 2835 次点击
    这是一个创建于 2391 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 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
    invoke
        2
    invoke  
       2018-05-09 15:12:09 +08:00   ❤️ 1
    这不是销毁了。。

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