Python 默认字典

问题描述

我发现了一些我无法理解的奇怪东西。 情况是这样的:

from collections import defaultdict
a = defaultdict(lambda: len(a))

这只是代码的一部分,上面的代码从来没有定义过'a'。

问题是:

  • 是否可以按原样使用 defaultdict,而不事先指定变量?
  • 如果可能,该代码的含义是什么?

解决方法

也许最好用一个例子来解释:

>>> a = defaultdict(lambda: len(b))
>>> b = 'abcd'
>>> a[0]
4

如您所见,可以在 b 中使用 lambda,即使此时 b 尚不存在。重要的是 b 在执行 lambda 时存在。此时,Python 将查找名为 b 的变量并使用它。


还要注意,原始代码不一定使用 defaultdict 本身的长度。它只是评估此时 a 是什么。看这个例子:

>>> a = defaultdict(lambda: len(a))
>>> a['a']
0
>>> a['b']
1

到目前为止,一切都很好。但是然后重命名一些东西:

>>> x = a
>>> a = []
>>> x['c']
0
>>> x['d']
0

现在 deaultdict 被命名为 x,但它不使用 len(x)。它仍然使用 len(a)。如果您将 defaultdict 发送到 a 没有任何意义的函数,则此警告可能变得很重要。

,

你说的是默认字典,当我尝试用一​​个键做某事但它不存在时,使用这个 lambda 作为键的初始值。因为你的 lambda 正在使用一个(即它自己的字典)并且你说它的长度。这意味着当您使用不在 dict 中的键执行操作时,dict 将使用 lambda 代替,或者在这种情况下将 dict 的长度作为值

gunicorn

输出

from collections import defaultdict
a = defaultdict(lambda: len(a))

a['one'] += 5 #here dict length is 0 so value is 0 + 5 = 5
a['two'] += 2 #jere dict length is 1 so value is 1 + 2 = 3
a['three'] += 1 #here dict length is 2 so value is 2 + 1 = 3
print(a.items())
print(a['newval']) #here newval doesnt exist so will use default value which is length of dict I.E 3
,

defaultdict 的工作原理如下。假设您有一个列表字典,并且您正在为可能不存在的键设置值。在这种情况下,你会做这样的事情:

d = dict()
if some_key not in d:
    d[some_key] = list()
d[some_key].append(some_value)

defaultdict 通过向它传递一个可调用对象(例如,intlistset,它将调用 int()(默认值) 0)、list()(默认值空列表)和 set()(默认值空集)。你的 lambda 也是一个可调用的,它返回整数,所以你会有一个带有 int 值的字典。但是您从表达式中获得的值将取决于字典的大小。

你能做a = defaultdict(lambda: len(a))吗?

是的,你可以。 lambda 在调用之前不会被执行,此时它会查找名称 a。比较这两种情况。

f = lambda: len(a)
a = defaultdict(f)
a[0]                  # this is when the lambda is called for the first time

但是,

g = lambda: len(b)
g()                   # this will raise a NameError
b = defauldict(g)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...