提问人:Adrian 提问时间:1/21/2021 最后编辑:Adrian 更新时间:1/21/2021 访问量:137
仅添加到字典中的一个列表 [重复]
Adding to only one list in dictionary [duplicate]
问:
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: []}
答:
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()
评论
fromkeys()
对每个键使用相同的对象。它不会创建新对象collections.defaultdict(list)
defaultdict