我来自C ++背景,我是Python的新手,我怀疑这个问题与[im]可变性有关。
我正在用Python构建JSON表示形式,该表示形式在一个“对象”中涉及多层嵌套列表和字典。我的目标是在最终结果上调用jsonify
,使其看起来像结构良好的数据。
在构建对象时遇到问题:
approval_groups_list = list()
approval_group_dict = dict()
for groupMemKey, groupvals in groupsAndMembersDict.items():
approval_group_dict["group_name"] = groupMemKey
approval_group_dict["name_dot_numbers"] = groupvals # groupvals is a list of strings
approval_groups_list.append(approval_group_dict)
entity_approval_unit["approval_groups"] = approval_groups_list
第一次运行的结果与预期的一样,但是在最后一次触摸groupMemkey时,这就是所有其他对象的镜像。
groupsAndMembersDict= {
'Art': ['string.1', 'string.2', 'string.3'],
'Math': ['string.10', 'string.20', 'string.30']
}
预期结果:
批准组:
[
{
"group_name": "Art",
"name_dot_numbers": ['string.1', 'string.2', 'string.3']
},
{
"group_name": "Math",
"name_dot_numbers": ['string.10', 'string.20', 'string.30']
}
]
实际结果:
批准组:
[
{
"group_name": "Math",
"name_dot_numbers": ['string.10', 'string.20', 'string.30']
},
{
"group_name": "Math",
"name_dot_numbers": ['string.10', 'string.20', 'string.30']
}
]
发生了什么,如何解决?
答案 0 :(得分:0)
通过写这个问题,我想到了一些可以解决此问题的方法,但是解决了我的问题-但是,我仍然不知道为什么会这样。也许更像是指针/引用问题?
approval_groups_list = list()
approval_group_dict = dict()
for groupMemKey, groupvals in groupsAndMembersDict.items():
approval_group_dict["group_name"] = groupMemKey
approval_group_dict["name_dot_numbers"] = groupvals
approval_groups_list.append(approval_group_dict.copy()) # <== note, here is the difference ".copy()"
entity_approval_unit["approval_groups"] = approval_groups_list
编辑:问题原来是Python一直都是[object]参考引用 。如果像我这样的Python新手,这意味着:“按引用传递,除非传递的东西是不可变的,否则按值传递”。因此,它在某种程度上没有与[im]可变性有关。主要是因为我缺乏对Python如何传递引用的理解。
答案 1 :(得分:0)
您的问题不是不变性,而是对象的可变性。我敢肯定,如果使用等效的C ++代码,您最终将获得相同的结果。
您在approval_group_dict
循环之前构造for
,并继续重复使用它。您所要做的就是在for
内移动构造,以便为每个循环创建一个新对象:
approval_groups_list = list()
for groupMemKey, groupvals in groupsAndMembersDict.items():
approval_group_dict = dict()
...