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

发现一个奇怪的地方- dict.get

  •  
  •   geew · 2013-11-12 16:33:35 +08:00 · 3180 次点击
    这是一个创建于 3838 天前的主题,其中的信息可能已经有所发展或是发生改变。
    d = {'a':1}

    def test():
    print 'run'
    return 2

    d.get('a', test()) # test会执行么?
    d.get('b', test()) # test会执行么?
    11 条回复    1970-01-01 08:00:00 +08:00
    geew
        1
    geew  
    OP
       2013-11-12 16:36:19 +08:00
    Docstring: D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
    -- 但是上例子中get a的时候test是会执行的
    geew
        2
    geew  
    OP
       2013-11-12 16:37:16 +08:00
    可以写成这样
    d.get('a') or test()
    xiaket
        3
    xiaket  
       2013-11-12 16:37:50 +08:00
    都会啊, 为了拿到test的返回值作为参数, 需要执行. 即是先执行test再将2作为参数交给get的, 这儿get没短路它.
    geew
        4
    geew  
    OP
       2013-11-12 16:44:08 +08:00
    @xiaket
    v = d.get('a') or 2 if test() else 3 # 会执行么
    v = d.get('a') or test() # 这个呢
    v = d.get('a') or (2 if test() else 3) # 这个呢

    感觉是优先级的问题
    ritksm
        5
    ritksm  
       2013-11-12 16:46:28 +08:00
    当然会。。。如@xiaket 所说。。。当test被执行的时候实际还没进入到get的逻辑里呢。。。
    geew
        6
    geew  
    OP
       2013-11-12 17:12:06 +08:00
    @ritksm 这就有个先后的问题了 为什么不是先get逻辑然后再处理其他的呢 为什么会是test先执行然后取其结果来进行get逻辑呢
    ritksm
        7
    ritksm  
       2013-11-12 17:16:06 +08:00
    @geew 因为test()是作为参数传入到方法里的...比如你写一个加法,难道不应该先确定两个参数再运算么...同理

    def add(a, b):
    return a+b

    add(1, random.randint())
    zenliver
        8
    zenliver  
       2013-11-12 19:47:25 +08:00
    建议你看看sicp这本书,,,这些问题都不是问题
    geew
        9
    geew  
    OP
       2013-11-13 09:28:38 +08:00
    @zenliver 谢谢推荐
    msg7086
        10
    msg7086  
       2013-11-13 18:35:06 +08:00
    简单说,因为get依赖test的返回值,所以要在其之后执行。
    hitsmaxft
        11
    hitsmaxft  
       2013-11-13 22:09:13 +08:00
    因为这里的参数列表是值传递的, python 才不管你 test()是啥玩意,运算取值再说。
    你所期待的应该是 io 之类的语言,参数列表直接传递,在实际使用的时候才进行运算。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:35 · PVG 05:35 · LAX 14:35 · JFK 17:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.