Python defaultdict常量工厂不使用';I don’我没有表现得像预期的那样

Python defaultdict常量工厂不使用';I don’我没有表现得像预期的那样,python,factory,defaultdict,Python,Factory,Defaultdict,我愿意将defaultdict与一个特别的default\u工厂一起使用,这更适合我的目的。默认工厂将是[0,0] 我已经实现了一个常量\u工厂函数: def constant_factory(value): return itertools.repeat(value).next 然后当我尝试使用它时,我的defaultdict有一个意外的行为(至少是我没有预料到的行为) 以下是一个例子: >>>import itertools >>>from co

我愿意将
defaultdict
与一个特别的
default\u工厂一起使用,这更适合我的目的。
默认工厂将是
[0,0]

我已经实现了一个
常量\u工厂
函数:

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]})
导入itertools >>>从集合导入defaultdict >>>dictio=defaultdict(常数工厂([0,0])) >>>对于X范围内的i(10): ... 词汇[i][0]+=1 >>>措辞 defaultdict(,{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(,{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])
您精心设计的callable会一次又一次地返回相同的列表。您对词典中的所有值使用相同的列表。上述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

因此,您的字典中充满了对一个列表的引用,而对该列表中的值的更改会反映在对该列表的引用打印的任何地方。

首先,只需使用:

defaultdict(lambda: [0, 0])
您精心设计的callable会一次又一次地返回相同的列表。您对词典中的所有值使用相同的列表。上述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

因此,您的字典中充满了对一个列表的引用,而对该列表中的值的更改会反映在对该列表的引用打印的任何地方。

谢谢,一切都很清楚!我阅读了文档并找到了常量工厂方法,但我使用它时并不了解它是如何工作的。谢谢,一切都很清楚!我阅读了文档并找到了常量工厂方法,但我使用它时并不了解它是如何工作的。