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

2013 年 11 月 12 日
 geew
d = {'a':1}

def test():
print 'run'
return 2

d.get('a', test()) # test会执行么?
d.get('b', test()) # test会执行么?
3579 次点击
所在节点    Python
11 条回复
geew
2013 年 11 月 12 日
Docstring: D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
-- 但是上例子中get a的时候test是会执行的
geew
2013 年 11 月 12 日
可以写成这样
d.get('a') or test()
xiaket
2013 年 11 月 12 日
都会啊, 为了拿到test的返回值作为参数, 需要执行. 即是先执行test再将2作为参数交给get的, 这儿get没短路它.
geew
2013 年 11 月 12 日
@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
2013 年 11 月 12 日
当然会。。。如@xiaket 所说。。。当test被执行的时候实际还没进入到get的逻辑里呢。。。
geew
2013 年 11 月 12 日
@ritksm 这就有个先后的问题了 为什么不是先get逻辑然后再处理其他的呢 为什么会是test先执行然后取其结果来进行get逻辑呢
ritksm
2013 年 11 月 12 日
@geew 因为test()是作为参数传入到方法里的...比如你写一个加法,难道不应该先确定两个参数再运算么...同理

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

add(1, random.randint())
zenliver
2013 年 11 月 12 日
建议你看看sicp这本书,,,这些问题都不是问题
geew
2013 年 11 月 13 日
@zenliver 谢谢推荐
msg7086
2013 年 11 月 13 日
简单说,因为get依赖test的返回值,所以要在其之后执行。
hitsmaxft
2013 年 11 月 13 日
因为这里的参数列表是值传递的, python 才不管你 test()是啥玩意,运算取值再说。
你所期待的应该是 io 之类的语言,参数列表直接传递,在实际使用的时候才进行运算。

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

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

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

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

© 2021 V2EX