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()
方法返回一个字典,该字典的值指向完全相同的空列表,无论哪个键。这使得该方法在本应用程序中没有那么有用(并且使许多用户感到困惑)。
From the docs:
fromkeys()
是一个返回新字典的类方法。value默认为"None
"。所有的值都只引用一个实例,所以value作为一个可变对象(如空列表)通常是没有意义的。若要获得不同的值,请使用字典推导式。
手动创建字典时,将空列表的另一个副本赋值给values。
首选方法是使用字典推导式:
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()