python in dictionaries repeat assignment, append to the list of exceptions that are thrown

Today met a mistake on python dictionary with. First on the code:

data = [{'id': '1', 'name': '管理员', 'role': 'admin', 'desc': '系统管理员', 'acl': None},
 {'id': '2', 'name': '研发', 'role': 'dev', 'desc': '研发人员', 'acl': None},
 {'id': '3', 'name': '测试', 'role': 'qa', 'desc': '测试人员', 'acl': None},
 {'id': '4', 'name': '项目经理', 'role': 'pm', 'desc': '项目经理', 'acl': None},
 {'id': '5', 'name': '产品经理', 'role': 'po', 'desc': '产品经理', 'acl': None},
 {'id': '6', 'name': '研发主管', 'role': 'td', 'desc': '研发主管', 'acl': None},
 {'id': '7', 'name': '产品主管', 'role': 'pd', 'desc': '产品主管', 'acl': None},
 {'id': '8', 'name': '测试主管', 'role': 'qd', 'desc': '测试主管', 'acl': None},
 {'id': '9', 'name': '高层管理', 'role': 'top', 'desc': '高层管理', 'acl': None},
 {'id': '10', 'name': '其他', 'role': 'others', 'desc': '其他', 'acl': None},
 {'id': '11', 'name': 'guest', 'role': 'guest', 'desc': 'For guest', 'acl': None},
 {'id': '12', 'name': '受限用户', 'role': 'limited', 'desc': '受限用户分组(只能编辑与自己相关的内容)', 'acl': None}]
depts = []
tmp_dept = {}
tmp_role = {}
roles = []
for i in data:
    print (i)
    tmp_dept["name"] = i["name"]
    tmp_dept["id"] = i["id"]
    tmp_role["name"] = i["name"]
    tmp_role["role"] = i["role"]
    depts.append(tmp_dept)
    roles.append(tmp_role)
print(depts,roles)

Logic very simple, it is the separation of the data into data in the two lists. During separation, two dictionaries temporary working out.
But in actual operation, but we did not get the desired result. The result is

[{'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}, {'name': '受限用户', 'id': '12'}]
[{'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}, {'name': '受限用户', 'role': 'limited'}]

date of the last data is repeated.
Then I realized that it should be appen data in question. Dictionary assignment suspected abnormalities. So View dictionary id after append statement and found that all of the id are the same. In other words, inserted into the dictionary depts roles are the same, even in the course of the iterative cycle date, the value of his constantly changing.
Solution:
In each iteration of the loop, re-create the dictionary

code show as below

data = [{'id': '1', 'name': '管理员', 'role': 'admin', 'desc': '系统管理员', 'acl': None},
 {'id': '2', 'name': '研发', 'role': 'dev', 'desc': '研发人员', 'acl': None},
 {'id': '3', 'name': '测试', 'role': 'qa', 'desc': '测试人员', 'acl': None},
 {'id': '4', 'name': '项目经理', 'role': 'pm', 'desc': '项目经理', 'acl': None},
 {'id': '5', 'name': '产品经理', 'role': 'po', 'desc': '产品经理', 'acl': None},
 {'id': '6', 'name': '研发主管', 'role': 'td', 'desc': '研发主管', 'acl': None},
 {'id': '7', 'name': '产品主管', 'role': 'pd', 'desc': '产品主管', 'acl': None},
 {'id': '8', 'name': '测试主管', 'role': 'qd', 'desc': '测试主管', 'acl': None},
 {'id': '9', 'name': '高层管理', 'role': 'top', 'desc': '高层管理', 'acl': None},
 {'id': '10', 'name': '其他', 'role': 'others', 'desc': '其他', 'acl': None},
 {'id': '11', 'name': 'guest', 'role': 'guest', 'desc': 'For guest', 'acl': None},
 {'id': '12', 'name': '受限用户', 'role': 'limited', 'desc': '受限用户分组(只能编辑与自己相关的内容)', 'acl': None}]
depts = []
roles = []
for i in data:
    tmp_dept = {}
    tmp_role = {}
    tmp_dept["name"] = i["name"]
    tmp_dept["id"] = i["id"]
    tmp_role["name"] = i["name"]
    tmp_role["role"] = i["role"]
    depts.append(tmp_dept)
    roles.append(tmp_role)
print(depts,roles)

Guess you like

Origin blog.51cto.com/quietguoguo/2480095