我愿意使用更适合我的目的defaultdict
的ad hoc 。 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]})
看来,每次我愿意增加与 key 对应的列表的第一个槽的i
值时,它都会增加第一个槽的所有值。
由于我对使用 defaultdict 和方法包装器很陌生,任何人都可以解释我做错了什么,因为我相信 Python 做得很好吗?