下面是2个相同的函数,但一个具有dict.get(),另一个具有if键。在15、30和45上,它必须获取哈希值,但是它返回默认值-函数,即使键已经在字典中了?
D = dict()
def bugged(i):
def nest():
print('Not in D')
div, mod = divmod(i, 5)
D[i] = (div, mod)
return div, mod
print()
print(i)
print(i in D)
return D.get(i, nest())
def works(i):
def nest():
print('Not in D')
div, mod = divmod(i, 5)
D[i] = (div, mod)
return div, mod
print()
print(i)
print(i in D)
if i in D:
return D[i]
return nest()
f = works
f = bugged
for x in range (0,50,5):
f(x)
print('='*100)
for x in range (0,50,3):
f(x)
在Python中,参数是在函数调用之前进行求值的,因此在您的情况下,nest()是在D.get之前调用的。由于巢会突变D,因此D.get总是返回返回nest()中设置的值。
省略print语句,可以使用setdefault dict方法更简洁地表达您的函数:
def func(i):
return D.setdefault(i, divmod(i, 5))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句