我想使用dict.fromkeys初始化集合字典(在Python 2.6中),但是结果结构的行为却很奇怪。进一步来说:

>>>> x = {}.fromkeys(range(10), set([]))
>>>> x
{0: set([]), 1: set([]), 2: set([]), 3: set([]), 4: set([]), 5: set([]), 6: set([]), 7: set([]), 8: set([]), 9: set([])}
>>>> x[5].add(3)
>>>> x
{0: set([3]), 1: set([3]), 2: set([3]), 3: set([3]), 4: set([3]), 5: set([3]), 6: set([3]), 7: set([3]), 8: set([3]), 9: set([3])}

我显然不想将3添加到所有集合中,而只添加到与x[5]相对应的集合中。当然,我可以通过不使用x初始化fromkeys来避免此问题,但是我想了解我在这里缺少的内容。

最佳答案

dict.fromkeys的第二个参数只是一个值。您已经创建了一个字典,该字典的设置与每个键的值相同。大概您了解它的工作方式:

>>> a = set()
>>> b = a
>>> b.add(1)
>>> b
set([1])
>>> a
set([1])

您在那看到相同的行为;在您的情况下,x[0]x[1]x[2](等)都是访问完全相同的set对象的不同方法。

使用其字符串表示形式包括其内存地址的对象,可以更容易地看到它们,在这里您可以看到它们是相同的:
>>> dict.fromkeys(range(2), object())
{0: <object object at 0x1001da080>,
 1: <object object at 0x1001da080>}

关于python - dict.fromkeys的有害行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3000468/

10-11 22:03