我有一个接收列表并输出字典的函数。我在循环内创建字典,并在函数内分配字典值。我想问的一个简化版本如下:
def ccD(H0, O_m, O_D):
num = 0
for j in range(len(zcc)):
num = num + cc(j, H0, O_m, O_D)
return num
输出如下:
import numpy as np
def get_myDict(tmp_list):
my_dict = dict.fromkeys(tmp_list,
dict.fromkeys([i**2 for i in tmp_list],0))
for i in tmp_list:
my_list = [j for j in np.arange(i)]
my_dict[i][i**2] = sum(my_list[:]) + i
return my_dict
我希望输出是
[In 1]: get_myDict([1,2,3,4])
[Out 1]: {1: {1: 1, 4: 3, 9: 6, 16: 10},
2: {1: 1, 4: 3, 9: 6, 16: 10},
3: {1: 1, 4: 3, 9: 6, 16: 10},
4: {1: 1, 4: 3, 9: 6, 16: 10}}
如果我在函数中使用以下命令定义my_dict,我将获得所需的输出:
{1: {1: 1, 4: 0, 9: 0, 16: 0},
2: {1: 0, 4: 3, 9: 0, 16: 0},
3: {1: 0, 4: 0, 9: 6, 16: 0},
4: {1: 0, 4: 0, 9: 0, 16: 10}}
我认为这与共享引用有某种关系。有人可以在这里解释我在做什么错吗?
答案 0 :(得分:3)
是的,您实际上是在用一个二次键创建一个字典,并多次引用它。
使用dict理解(自python 2.7起):
my_dict = {k: {k2: 0 for k2 in [i**2 for i in tmp_list]} for k in tmp_list}
答案 1 :(得分:1)
原因是您正在有效地将单个值传递给dict.fromkeys()
方法。为了说明您在做什么:
import numpy as np
def get_myDict(tmp_list):
value = dict.fromkeys([i**2 for i in tmp_list], 0)
my_dict = dict.fromkeys(tmp_list, value)
...
因此所有词典都将引用相同的value
词典。
也许collection.defaultdict
在这里会更方便吗?