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

2013-11-12 16:33:35 +08:00
 geew
d = {'a':1}

def test():
print 'run'
return 2

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

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

add(1, random.randint())
zenliver
2013-11-12 19:47:25 +08:00
建议你看看sicp这本书,,,这些问题都不是问题
geew
2013-11-13 09:28:38 +08:00
@zenliver 谢谢推荐
msg7086
2013-11-13 18:35:06 +08:00
简单说,因为get依赖test的返回值,所以要在其之后执行。
hitsmaxft
2013-11-13 22:09:13 +08:00
因为这里的参数列表是值传递的, 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