Python 在迭代时在字典中将键设置为相同的值

Python 在迭代时在字典中将键设置为相同的值,python,python-2.7,Python,Python 2.7,我有他的非常简单的字典,叫做mydict,我正在迭代它并设置新的嵌套键。出于某种原因,在每次迭代中都会设置每个父键。每个random键都应该有一个随机生成的数字。这个dict.fromkeys(myset,{})似乎有点问题,好像我硬编码了它,然后事情就好了。我尝试了copy和deepcopy,但没有成功 import random myset = ['A', 'B', 'C'] mydict = dict.fromkeys(myset, {}) for k, v in mydict.items

我有他的非常简单的字典,叫做
mydict
,我正在迭代它并设置新的嵌套键。出于某种原因,在每次迭代中都会设置每个父键。每个
random
键都应该有一个随机生成的数字。这个
dict.fromkeys(myset,{})
似乎有点问题,好像我硬编码了它,然后事情就好了。我尝试了
copy
deepcopy
,但没有成功

import random
myset = ['A', 'B', 'C']
mydict = dict.fromkeys(myset, {})
for k, v in mydict.items():
    mydict[k]['random'] = random.random()
print mydict
输出如下所示:

{'A': {'random': 0.09458900537947934}, 'C': {'random': 0.09458900537947934}, 'B': {'random': 0.09458900537947934}}

您可以使用由键和值组成的元组初始化您的
mydict

import random

myset = ['A', 'B', 'C']
mydict = dict(zip(myset, iter(lambda: {}, None)))

for k, v in mydict.items():
    mydict[k]['random'] = random.random()

print(mydict)
印刷品:

{'A': {'random': 0.17573941764965995}, 'B': {'random': 0.7591872462452937}, 'C': {'random': 0.6027577677034227}}
试试这个:

随机导入
myset=['A','B','C']
mydict={}
对于myset中的k:
temp={'random':random.random()}
mydict[k]=温度
打印(mydict)
制作一个空的dict然后填充它更容易

输出:

{'A': {'random': 0.8487768382668905}, 'B': {'random': 0.3199770033314223}, 'C': {'random': 0.9574897543475179}}

您观察到的行为的原因是调用
dict.fromkeys
函数,该函数获取值(在您的例子中为空字典对象)并将其分配给每个键。因此
mydict
中的所有键都指向相同的值(字典)。对于For循环中的每个键,您都使用更新的
random
键更新相同的字典。如果您想看到更多,请执行以下操作:

for k, v in mydict.items():
  print('%s %s' % (k, id(v)))

您将看到,您的
mydict
字典中的每个值都是完全相同的dict。对于工作代码,请尝试@okawo answer。

因为您在
mydict
中使用相同的字典。尝试更改为
mydict={'A':{},'B':{},'C':{}
,它将work@BlackBear我意识到,正如我提到的硬编码。这只是一个简单的例子,
mydict
需要从集合中派生出来,这就是我为什么要尝试使用
copy
deepcopy
的原因。这个错误让我感到惊讶。我还是不明白为什么会这样。毕竟,当我对myset中的k执行
{k:{}==dict.fromkeys(myset,{})
时,它返回True。然而,第一个有效,而第二个无效