如何解决Python 默认字典
我发现了一些我无法理解的奇怪东西。 情况是这样的:
from collections import defaultdict
a = defaultdict(lambda: len(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
通过向它传递一个可调用对象(例如,int
、list
、set
,它将调用 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。