在Python中我有下面的代码行:为什么collections.defaultdict的lambda没有参数?
my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))
我不明白它在做什么。我不明白的一件事是我们没有为lambda函数指定任何变量。
在Python中我有下面的代码行:为什么collections.defaultdict的lambda没有参数?
my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))
我不明白它在做什么。我不明白的一件事是我们没有为lambda函数指定任何变量。
的default_factory
参数defaultdict
应该是不接受它创建并返回一个对象,这将成为获得任何引用不存在的项的值的任何参数的函数。
提供这种功能的一种方法是使用内联lambda
expression创建一个匿名类。另一种方法是使用内置函数的名称创建并返回其中一种内置类型,如float
,int
,tuple
等。当任何那些被调用时没有参数时,返回的对象会有一些默认值 - 通常是零或空的东西。
my_var = collections.defaultdict(
lambda: collections.defaultdict(
collections.defaultdict(float)))
但是,(在这两种形式),这是不正确的,因为一些defaultdict
电话没有:
首先,您可以通过格式化像这样让这样的代码,你有更多的可读可调用的函数参数。因为Python是一种解释型语言,所以直到您尝试使用my_var
时才会知道这一点。对于像例如东西:
my_var['level1']['level2']['level3'] = 42.
会导致:
my_var = collections.defaultdict(
lambda: collections.defaultdict(
lambda: collections.defaultdict(float))) # need lambda here, too
事后前面的分配将不会被考虑:
TypeError: first argument must be callable or None
这可以通过添加另一个lambda
固定一个错误。
由于defaultdict
是内置dict
类的子类,你可以使用json
模块漂亮地打印一个实例:
import collections
my_var = collections.defaultdict(
lambda: collections.defaultdict(
lambda: collections.defaultdict(float)))
import json # for pretty printing dictionaries
# Auto-creates the 3 levels of dictionaries needed.
my_var['level1']['level2']['level3A'] = 42.
# Similar to above but additionally auto-creates a
# my_var['level1']['level2']['level3B'] entry with default value of 0.0
my_var['level1']['level2']['level3C'] = my_var['level1']['level2']['level3B'] + 1
print(json.dumps(my_var, indent=4))
输出:
{
"level1": {
"level2": {
"level3A": 42.0,
"level3B": 0.0,
"level3C": 1.0
}
}
}
我想你应该能够理解它现在的功能 - 但是如果没有,请告诉我。
真棒回答。谢谢哥们 –
因为工厂函数不接受任何参数。 – vaultah