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
altboy
V2EX  ›  Python

来来来,不要往解释器里扔,告诉我答案,并解释,是时候秀一波技术了,哈哈

  •  
  •   altboy · 2017-08-04 10:05:23 +08:00 · 4559 次点击
    这是一个创建于 2701 天前的主题,其中的信息可能已经有所发展或是发生改变。
    def mul():
    return [lambda x: i*x for i in range(4)]
    print([m(2) for m in mul()])
    10 条回复    2017-08-04 17:18:39 +08:00
    SingeeKing
        1
    SingeeKing  
       2017-08-04 10:10:04 +08:00
    首先你确定 def 和 print 不是在两行吗
    SingeeKing
        2
    SingeeKing  
       2017-08-04 10:10:40 +08:00
    好吧什么时候改了。。。

    那么,你确定第二行没有缩进吗。。。
    SingeeKing
        3
    SingeeKing  
       2017-08-04 10:22:29 +08:00   ❤️ 3
    mul() 返回的应该是一个列表 [lambda x: 3 * x, lambda x: 3 * x, lambda x: 3 * x, lambda x:3 * x]

    因为匿名函数存储在列表中仅存储了地址,四次拷贝为浅拷贝,之后就是改变了 i 的值,因此四个元素一同改变

    最终返回结果 [6, 6, 6, 6]

    (以上都是我瞎说的)
    araraloren
        5
    araraloren  
       2017-08-04 10:33:25 +08:00   ❤️ 2
    ~~依赖缩进的语言 遇到了 缩进不好使的网站。。(逃
    Readme16
        6
    Readme16  
       2017-08-04 10:33:28 +08:00 via iPhone   ❤️ 1
    三楼正解,另如果 return (lambda x:x*i for i in range(4)) 那么输出的是[0,2,4,6]
    skadi
        7
    skadi  
       2017-08-04 10:41:31 +08:00
    缩进语言怎么面向 ctrlC 编程?:)
    altboy
        8
    altboy  
    OP
       2017-08-04 10:41:59 +08:00
    @SingeeKing 有缩进
    fengzixu
        9
    fengzixu  
       2017-08-04 16:59:57 +08:00
    http://littledriver.net/2017/03/05/%E5%B7%A5%E4%BD%9C%E4%B8%AD%E8%B8%A9%E8%BF%87%E7%9A%84%E7%9A%84%E5%9D%91%E4%B9%8Bgolang%E7%9A%84%E4%B8%B4%E6%97%B6%E5%8F%98%E9%87%8F/ 在 golang 里面同样有这种问题,之前写过一个类似的博客。但是不知道,真正的原因是不是这样。总感觉是值都存在了同一个内存的位置
    jiang42
        10
    jiang42  
       2017-08-04 17:18:39 +08:00 via iPhone
    是 free variable capture 的问题

    fs = [lambda x: x*i for i in range(3)]
    i = 10
    [f(1) for f in fs]
    [10, 10, 10]

    #6 楼的情况是返回了一个 generator,在 i 更新之前 lambda 就出来了

    想把 i 锁在 lambda 里可以这么做
    def bar(i):
    return lambda x:x*i

    def foo():
    return [bar(i) for i in range(3)]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.