我正在使用Python处理字典,并且正在使用以下命令搜索值:
my_dictionary_object.get("key")
众所周知,如果字典中缺少键,它将返回None
对象。
因此,为了节省额外的行并使我的代码更有趣,我正在尝试:
def my_function():
'''do some calculations'''
return missing_value_from_dictionary
现在这是有趣的部分;当我这样做
my_dictionary_object.get("key", my_function())
无论是否缺少键,它都会执行该功能,所以我想让我们去掉括号,然后这样做:
my_dictionary_object.get("key", my_function)
和(以防万一)
my_dictionary_object.get("key", lambda: my_function())
但是没有lambda的那个没有执行(因为它从未被调用过)与具有lambda的那个也发生了同样的事情。
TL; DR
我的问题是,如果字典中存在键,为什么函数会被执行?
是我做错了什么,还是我想念这里?
答案 0 :(得分:4)
在my_dictionary_object.get("key", my_function())
中,执行类似于:
my_function()
。因此,让我们调用该函数,并在其位置使用返回值。就像在a = my_function()
中一样,python会调用该函数并将返回的值放在其位置。mydictionary_object.get(..)
。换句话说,如果键不存在,dictionary.get("key", default)
将仅返回第二个参数。如果它是lambda,则返回lambda。 Lambda是一个对象。请注意,在.get("key", my_function())
中,my_function()
从技术上讲不是第二个参数。由于执行该函数而返回的结果值是第二个参数-希望可以解释您的错误之处。
您要查找的内容实际上是在另一个名为defaultdict
的容器中捕获的。
您要做的是:
from collections import defaultdict
my_dictionary_object = defaultdict(my_function) # my_function should not take any argument.
my_dictionary_object["non-existing-key"] # Magic happens, see below.
会发生什么,如果键(= x)不存在,则调用my_function
时将不带任何参数,并且字典将使用函数针对键(= x)返回的值来更新字典。像这样:
if "key" not in dictionary:
dictionary["key"] = my_function()
return dictionary["key"]