dict.fromkeys的有害行为

发布于 2021-01-29 19:24:05

我想使用初始化一个字典集(在Python 2.6中)dict.fromkeys,但是结果结构表现得很奇怪。进一步来说:

>>>> 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,但是我想了解一下我在这里缺少的内容。

关注者
0
被浏览
37
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    的第二个参数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>}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看