【问题标题】:Adding to only one list in dictionary [duplicate]仅添加到字典中的一个列表[重复]
【发布时间】:2021-04-26 01:42:51
【问题描述】:
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: []}

【问题讨论】:

  • fromkeys() 对每个键使用相同的对象。它不会创建新对象
  • 改用collections.defaultdict(list)
  • 为什么不能使用defaultdict?或使用字典理解

标签: python dictionary append fromkeys


【解决方案1】:

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

来自docs

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

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

首选方法是使用dictionary comprehension

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()    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2022-01-19
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多