Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么collections.defaultdict的lambda不能有参数?_Python_Lambda - Fatal编程技术网

Python 为什么collections.defaultdict的lambda不能有参数?

Python 为什么collections.defaultdict的lambda不能有参数?,python,lambda,Python,Lambda,在python中,我有以下代码行: my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float))) 我不明白它在做什么。我不明白的一件事是我们怎么没有为lambda函数指定任何变量。默认工厂的defaultdict参数应该是一个函数,它不接受任何创建并返回一个对象的参数,该对象将成为任何不存在的获取的条目的值参考 提供此类函数的一种方法是使用内联函数创建匿名函数。

在python中,我有以下代码行:

my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))
我不明白它在做什么。我不明白的一件事是我们怎么没有为lambda函数指定任何变量。

默认工厂的
defaultdict
参数应该是一个函数,它不接受任何创建并返回一个对象的参数,该对象将成为任何不存在的获取的条目的值参考

提供此类函数的一种方法是使用内联函数创建匿名函数。另一种方法是使用内置函数的名称,该函数创建并返回内置类型之一,如
float
int
tuple
,等等。当在没有参数的情况下调用其中任何一个时,返回的对象的值将具有一些默认值-通常为零或空

首先,您可以通过如下方式格式化代码,使其更具可读性:

my_var = collections.defaultdict(
            lambda: collections.defaultdict(
                collections.defaultdict(float)))
但是,(在任何一种形式中)它都是不正确的,因为一些
defaultdict
调用没有可调用的函数参数。因为Python是一种解释语言,所以在尝试使用
my\u var
之前,您不会知道这一点。例如:

my_var['level1']['level2']['level3'] = 42.
将导致:

TypeError:第一个参数必须可调用或无
这可以通过添加另一个
lambda
来解决:

my_var = collections.defaultdict(
            lambda: collections.defaultdict(
                lambda: collections.defaultdict(float)))  # need lambda here, too
之后,前面的赋值将不会被视为错误

由于
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))
输出:

{
“一级”:{
“二级”:{
“3A级”:42.0,
“3b级”:0.0,
“3c级”:1.0
}
}
}

我认为您现在应该能够理解它的功能,但如果没有,请告诉我。

因为工厂函数不接受任何参数。