仅添加到字典中的一个列表 [重复]

Adding to only one list in dictionary [duplicate]

提问人:Adrian 提问时间:1/21/2021 最后编辑:Adrian 更新时间:1/21/2021 访问量:137

问:

def stack_ov_test():
    my_set = set([1, 2, 1, 2, 3, 4, 3, 2, 3])
    my_dictionary = dict.fromkeys(my_set, [])
    my_dictionary[1].append(0)
    print(my_dictionary)  #  {1: [0], 2: [0], 3: [0], 4: [0]}

我认为上面的代码几乎是不言自明的,这就是为什么这让我如此困扰。 我只想从集合/列表中创建一个字典,然后逐渐将数据添加到每个键列表中。引用我要追加到的列表时,字典中的所有列表都在修改中。 有人可以解释一下我错过了什么吗? 谢谢!

小编辑:

当我手动创建字典时,一切照常工作:

def stack_ov_test():
    my_dictionary = {1: [], 2: [], 3: []}
    my_dictionary[1].append(0)
    print(my_dictionary)  #  {1: [0], 2: [], 3: []}
python 字典 追加 fromkeys

评论

3赞 deadshot 1/21/2021
fromkeys()对每个键使用相同的对象。它不会创建新对象
0赞 Jean-François Fabre 1/21/2021
改用collections.defaultdict(list)
0赞 deadshot 1/21/2021
为什么不能使用?或使用字典推导defaultdict

答:

1赞 Timur Shtatland 1/21/2021 #1

具有空列表参数的方法返回一个字典,其值指向完全相同的空列表,无论哪个键。这使得该方法不如它对本应用程序有用(并且让许多用户感到困惑)。fromkeys()

文档中:

fromkeys()是返回新字典的类方法。value 默认为 。所有值都只引用单个实例,因此 value 是可变对象(如空列表)通常没有意义。若要获取不同的值,请改用字典推导式。None

手动创建字典时,将空列表的不同副本分配给值。

首选方法是使用字典推导

def stack_ov_test():
    my_set = set([1, 2, 1, 2, 3, 4, 3, 2, 3])
    my_dict = {k: [] for k in my_set}
    print(my_dict) # {1: [], 2: [], 3: [], 4: []}
    my_dict[1].append(0)
    print(my_dict)  # {1: [0], 2: [], 3: [], 4: []}

stack_ov_test()