试图写入字典中的特定键,但它正在写入整个字典中的所有键

时间:2019-07-20 06:26:37

标签: python dictionary

我试图从一个字符列表中计算出很多不同的变量,并将它们放入嵌套字典中。但是,由于特定的任务,彼此相邻的词典在它们内部都具有相同的键,如dataDict中所示。 我正在尝试计算具有特定值的事物,因此,每当我尝试将1添加到某个键的值时,所有在字典中具有该键的项都将1添加到它们的值,而不仅仅是我想添加的一项1到。我想知道是否有办法阻止这种情况的发生,或者是否有更好的方法来做我想做的事情。 键必须相同,因为整个字典的一般形状是:

for chunk in map(dict, zip(*[iter(x.items())] * 10)):
    print(chunk)

下面的代码旨在显示正在发生的事情,实际上访问dataDict的所有键都是变量,但它们都可以正常工作。

我已经研究过使用计数器,但是据我所知,我遇到了同样的问题。

{'a':{1:{'a':0, 'b':0, 'c':0 , ...}, 2 :{'a':0, ...}, ...}, 'b':{...}}

预期:

dataDict = {'G':{1:{'a':0}, 2:{'a':0}, 3:{'a':0}}, 'L':{1:{'a':0}, 2:{'a':0}, 3:{'a':0}}}

characters = ["l", "i", "s", "t", " ", "o", "f", " ", "c", "h", "a", "r", "a", "c", "t", "e", "r", "s"]

for i in string:
    if tweet.index(i) > 2:
        dataDict['G'][1]['a'] += 1  

实际:

dataDict = {'G':{1:{'a':15}, 2:{'a':0}, 3:{'a':0}}, 'L':{1:{'a':0}, 2:{'a':0}, 3:{'a':0}}}

制作dataDict的代码是:

dataDict = {'G':{1:{'a':15}, 2:{'a':15}, 3:{'a':15}, 'L':{1:{'a':15}, 2:{'a':15}, 3:{'a':15}}}

1 个答案:

答案 0 :(得分:2)

字典是Python中的引用类型。这取决于您如何在这里形成dataDict。我认为您在许多地方使用/分配了相同的变量,而所有这些都指向相同的内存位置。

因此更新其中任何一个就像反映其他人的价值观。

为快速理解,请查看以下在Terminal上执行的3个代码段。

  

问题

>>> d = {"a": 0}
>>> 
>>> data = {1: d, 2: d, 3: d}
>>> 
>>> data
{1: {'a': 0}, 2: {'a': 0}, 3: {'a': 0}}
>>> 
>>> data[1]['a'] += 1
>>> 
>>> data
{1: {'a': 1}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
  

解决方案1 ​​

>>> # 1st way
... 
>>> data = {1: {**d}, 2: {**d}, 3: {**d}}
>>> data
{1: {'a': 1}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
>>> data[1]['a'] += 1
>>> 
>>> data
{1: {'a': 2}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
>>> 
  

解决方案2(使用深度复制)

>>> # 2nd way
...
>>> from copy import deepcopy
>>> 
>>> d
{'a': 1}
>>> 
>>> data = {1: deepcopy(d), 2: deepcopy(d), 3: deepcopy(d)}
>>> data
{1: {'a': 1}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
>>> data[1]['a'] += 1
>>> data
{1: {'a': 2}, 2: {'a': 1}, 3: {'a': 1}}
>>>