我发现了一些我无法理解的奇怪的东西。情况就是这样:
from collections import defaultdict
a = defaultdict(lambda: len(a))这只是代码的一部分,代码从未定义过上面的“a”。
问题如下:
defaultdict,而不事先指定变量?如果可能的话,发布于 2021-01-04 12:25:01
也许最好用一个例子来解释:
>>> a = defaultdict(lambda: len(b))
>>> b = 'abcd'
>>> a[0]
4正如您所看到的,即使b在lambda中还不存在,也可以在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没有任何意义的函数,则此警告可能变得非常重要。
发布于 2021-01-04 12:27:44
您说的是默认dict,当我尝试用键做一些事情,但它不存在时,使用这个lambda作为键的初始值。因为您的lambda使用的是一个(即切分它自己),并且您说它的长度。这意味着当您使用不在dict中的键执行操作时,dict将使用lambda代替,或者在本例中使用dict的长度作为值。
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发布于 2021-01-04 12:28:51
以下是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值的dict。但是从表达式中得到的值将取决于dict的大小。
你能做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)https://stackoverflow.com/questions/65562568
复制相似问题