更改一个键的值将更改使用fromkeys()创建的集合字典中所有键的值



我正在初始化一个像这样的序列

seq = {'a', 'b', 'c', 'd', 'e'}

现在我使用fromkeys()将序列转换为集合字典。下面是我正在做的:

val = set()
seq_dict =  dict.fromkeys(seq, val)

现在看来,如果只向我的一个字典键集添加一个元素,那么该元素将被添加到所有其他集合。下面是示例:

seq_dict['a'].add("val1")
print(seq_dict)
{'d': {'val1'}, 'c': {'val1'}, 'b': {'val1'}, 'a': {'val1'}, 'e': {'val1'}}

不确定我是否以正确的方式使用fromkeys ?

fromkeys方法按预期工作,因为您有正确的结果:一个字典,其中键是seq变量中的字符,并且每个值都是空集。

您的问题是由于您分配的值的可变性:您为所有关键字分配了一个空集作为值。如果您更改此(seq_dict['a'].add("val1")),则所有关键字的值都被更改(每个关键字引用原始空集)。

您可能需要使用字典推导式(它为每个键创建一个新的空集的不同副本)来避免此问题:

seq = {'a', 'b', 'c', 'd', 'e'}
seq_dict = {key: set() for key in seq}
val = set()
seq_dict =  dict.fromkeys(seq, val)

您正在用相同的set初始化seq_dict(amutable)type),所以编辑seq_dict['a']你编辑的是同一个set,它是所有其他键的值。


如果您不希望发生这种情况,则必须以其他方式初始化dict序列。

>>> d = {i: set() for i in ('a', 'b', 'c', 'd', 'e')}
>>> d
{'a': set(), 'b': set(), 'c': set(), 'd': set(), 'e': set()}
>>> d['a']
set()
>>> d['a'].add('ehi')
>>> d
{'a': {'ehi'}, 'b': set(), 'c': set(), 'd': set(), 'e': set()}

所以,换句话说,你必须"隔离">**immutable**的set:

部分
seq = {'a', 'b', 'c', 'd', 'e'}
seq_dict = {key: set() for key in seq}

最新更新