Python 默认字典
Python defaultdict
我发现了一些我无法理解的奇怪的东西。
是这样的:
from collections import defaultdict
a = defaultdict(lambda: len(a))
这只是代码的一部分,代码中没有在上面定义'a'
问题是:
- 是否可以按原样使用
defaultdict
,而不是事先指定变量?
- 如果可能的话,那个代码是什么意思?
也许最好用一个例子来解释:
>>> a = defaultdict(lambda: len(b))
>>> b = 'abcd'
>>> a[0]
4
如您所见,可以在 lambda
中使用 b
,即使此时 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 使用的是(即字典本身)并且您说的是它的长度。这意味着当您使用不在字典中的键执行操作时,字典将使用 lambda 代替,或者在这种情况下,字典的长度作为值
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
输出
dict_items([('one', 5), ('two', 3), ('three', 3)])
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 也是可调用的,它是 returns 整数,因此您将拥有一个带有 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)
我发现了一些我无法理解的奇怪的东西。 是这样的:
from collections import defaultdict
a = defaultdict(lambda: len(a))
这只是代码的一部分,代码中没有在上面定义'a'
问题是:
- 是否可以按原样使用
defaultdict
,而不是事先指定变量? - 如果可能的话,那个代码是什么意思?
也许最好用一个例子来解释:
>>> a = defaultdict(lambda: len(b))
>>> b = 'abcd'
>>> a[0]
4
如您所见,可以在 lambda
中使用 b
,即使此时 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 使用的是(即字典本身)并且您说的是它的长度。这意味着当您使用不在字典中的键执行操作时,字典将使用 lambda 代替,或者在这种情况下,字典的长度作为值
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
输出
dict_items([('one', 5), ('two', 3), ('three', 3)])
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 也是可调用的,它是 returns 整数,因此您将拥有一个带有 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)