gpt4 book ai didi

python - defaultdict constant_factory 的行为不符合预期

转载 作者:太空宇宙 更新时间:2023-11-04 10:44:54 26 4
gpt4 key购买 nike

我愿意使用defaultdict有一个临时 default_factory这更适合我的目的。 default_factory将是 [0,0] .

我已经实现了 constant_factory功能:

def constant_factory(value):
return itertools.repeat(value).next

然后当我尝试使用它时,我的 defaultdict有意外行为(至少是我没想到的行为)。

这是一个例子:

>>>import itertools
>>>from collections import defaultdict
>>>dictio=defaultdict(constant_factory([0,0]))
>>>for i in xrange(10):
... dictio[i][0]+=1
>>>dictio
defaultdict(<method-wrapper 'next' of itertools.repeat object at 0x000000000355FC50>, {0: [10, 0], 1: [10, 0], 2: [10, 0], 3: [10, 0], 4: [10, 0], 5: [10, 0], 6: [10, 0], 7: [10, 0], 8: [10, 0], 9: [10, 0]})

相反,我想得到:defaultdict(<method-wrapper 'next' of itertools.repeat object at 0x000000000355FC50>, {0: [1, 0], 1: [1, 0], 2: [1, 0], 3: [1, 0], 4: [1, 0], 5: [1, 0], 6: [1, 0], 7: [1, 0], 8: [1, 0], 9: [1, 0]})

看来,每次我都愿意增加与键 i 对应的列表第一个槽的值。 ,它会增加第一个插槽的所有值。

由于我对使用 defaultdict 和方法包装器还很陌生,因为我相信 Python 正在完美地完成它的工作,所以任何人都可以向我解释我做错了什么吗?

最佳答案

首先,只需使用:

defaultdict(lambda: [0, 0])

您精心制作的可调用对象一遍又一遍地返回相同的列表。您正在为字典中的所有 值使用相同的列表。上面的 lambda 每次被调用时都会返回一个列表:

>>> import itertools
>>> lambda_default = lambda: [0, 0]
>>> iter_default = itertools.repeat([0, 0]).next
>>> lambda_default() is lambda_default()
False
>>> iter_default() is iter_default()
True

因此,您用对一个列表的引用填充字典,并且在该列表中更改值会反射(reflect)在打印对该列表的引用的任何地方。

关于python - defaultdict constant_factory 的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com