首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么collections.defaultdict的lambda不能有任何参数?

为什么collections.defaultdict的lambda不能有任何参数?
EN

Stack Overflow用户
提问于 2016-08-17 06:36:05
回答 1查看 1K关注 0票数 1

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

代码语言:javascript
复制
my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-17 15:14:18

default_factory参数到defaultdict应该是一个函数,它不接受创建和返回一个对象的任何参数,该对象将成为被引用的任何不存在的条目的值。

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

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

代码语言:javascript
复制
my_var = collections.defaultdict(
            lambda: collections.defaultdict(
                collections.defaultdict(float)))

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

代码语言:javascript
复制
my_var['level1']['level2']['level3'] = 42.

将导致:

代码语言:javascript
复制
TypeError: first argument must be callable or None

可以通过添加另一个lambda来修复这个问题。

代码语言:javascript
复制
my_var = collections.defaultdict(
            lambda: collections.defaultdict(
                lambda: collections.defaultdict(float)))  # need lambda here, too

然后,前面的赋值将不会被视为错误。

由于defaultdict是内置dict类的子类,所以可以使用json模块来打印一个实例:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
{
    "level1": {
        "level2": {
            "level3A": 42.0, 
            "level3B": 0.0, 
            "level3C": 1.0
        }
    }
}

我认为你应该能够理解它现在的作用,但如果不是,请告诉我。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38989635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档