Python 默认字典

如何解决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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?