为什么 collections.defaultdict 的 lambda 可以没有参数?

2024-04-24 20:59:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))

我不明白它在做什么。我不明白的一点是我们怎么没有为lambda函数指定任何变量。在


Tags: lambda函数代码varmyfloatcollectionsdefaultdict
1条回答
网友
1楼 · 发布于 2024-04-24 20:59:32

defaultdictdefault_factory参数应该是一个函数,该函数不接受创建并返回对象的任何参数,该对象将成为被引用的任何不存在的项的值。在

提供此类函数的一种方法是使用内联^{} expression创建一个匿名函数。另一种方法是使用一个内置函数的名称,它创建并返回一个内置类型,如floatinttuple等。当这些中的任何一个不带参数的调用时,返回的对象的值将有一些默认值-通常是零或空。在

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

my_var = collections.defaultdict(
            lambda: collections.defaultdict(
                collections.defaultdict(float)))

但是,(无论哪种形式)都是不正确的,因为一些defaultdict调用没有可调用的函数参数。因为Python是一种解释语言,所以在尝试使用my_var之前,您不会知道这一点。例如:

^{pr2}$

会导致:

TypeError: first argument must be callable or None

可以通过添加另一个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))

输出:

{
    "level1": {
        "level2": {
            "level3A": 42.0, 
            "level3B": 0.0, 
            "level3C": 1.0
        }
    }
}

我想你应该能理解它现在做了什么,但如果不能,请告诉我。在

相关问题 更多 >