python3 嵌套循环同一个字典,尽然循环出 3 个点点,百思不得其解!引用数据类型出错, WHY?? 400 报错
描述:如下 msg_list 列表是为了实现多级评论的一个源数据结构,希望将此数据结构改造为可用于分级展示的数据结构。
思路:列表,字典都是属于引用类型的数据结构,即同一份数据不会被复制,而是以内存地址的方式引用的。
代码:
msg_list = [
{'id':1,'content':'好','parent_id':None},
{'id':2,'content':'不','parent_id':None},
{'id':3,'content':'啥','parent_id':None},
{'id':4,'content':'牛','parent_id':1},
{'id':5,'content':'马','parent_id':4},
{'id':6,'content':'兔','parent_id':2},
{'id':7,'content':'羊','parent_id':5},
{'id':8,'content':'犬','parent_id':3},
{'id':9,'content':'花','parent_id':1},
]
[row.setdefault('children',[]) for row in msg_list]
for item in msg_list:
if item['parent_id']:
for i in msg_list:
if item['id'] == i['id']:
i['children'].append(item)
for v in msg_list:
print(v)
执行结果:为什么列表中的字典是 [ 3 个点点] ???
{'id': 1, 'content': '好', 'parent_id': None, 'children': []}
{'id': 2, 'content': '不', 'parent_id': None, 'children': []}
{'id': 3, 'content': '啥', 'parent_id': None, 'children': []}
{'id': 4, 'content': '牛', 'parent_id': 1, 'children': [{...}]}
{'id': 5, 'content': '马', 'parent_id': 4, 'children': [{...}]}
{'id': 6, 'content': '兔', 'parent_id': 2, 'children': [{...}]}
{'id': 7, 'content': '羊', 'parent_id': 5, 'children': [{...}]}
{'id': 8, 'content': '犬', 'parent_id': 3, 'children': [{...}]}
{'id': 9, 'content': '花', 'parent_id': 1, 'children': [{...}]}
应该得到的结果:
{'id': 1, 'content': '好', 'parent_id': None, 'children': [{'id': 4, 'content': '牛', 'parent_id': 1, 'children': [{'id': 5, 'content': '马', 'parent_id': 4, 'children': [{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}]}]}, {'id': 9, 'content': '花', 'parent_id': 1, 'children': []}]}
{'id': 2, 'content': '不', 'parent_id': None, 'children': [{'id': 6, 'content': '兔', 'parent_id': 2, 'children': []}]}
{'id': 3, 'content': '啥', 'parent_id': None, 'children': [{'id': 8, 'content': '犬', 'parent_id': 3, 'children': []}]}
{'id': 4, 'content': '牛', 'parent_id': 1, 'children': [{'id': 5, 'content': '马', 'parent_id': 4, 'children': [{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}]}]}
{'id': 5, 'content': '马', 'parent_id': 4, 'children': [{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}]}
{'id': 6, 'content': '兔', 'parent_id': 2, 'children': []}
{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}
{'id': 8, 'content': '犬', 'parent_id': 3, 'children': []}
{'id': 9, 'content': '花', 'parent_id': 1, 'children': []}
另一种测试通过的代码供参考:
msg_list = [
{'id': 1, 'content': '好', 'parent_id': None},
{'id': 2, 'content': '不', 'parent_id': None},
{'id': 3, 'content': '啥', 'parent_id': None},
{'id': 4, 'content': '牛', 'parent_id': 1},
{'id': 5, 'content': '马', 'parent_id': 4},
{'id': 6, 'content': '兔', 'parent_id': 2},
{'id': 7, 'content': '羊', 'parent_id': 5},
{'id': 8, 'content': '犬', 'parent_id': 3},
{'id': 9, 'content': '花', 'parent_id': 1},
]
msg_list_dic = {
# 1:{'id':1,'content':'xxx','parent_id':None,'children':[]},
# 2:{'id':1,'content':'xxx','parent_id':None,'children':[]},
}
for item in msg_list:
item['children'] = [] # 将源数添加一个 key
msg_list_dic[item['id']] = item # 引用源数据
result = []
for item in msg_list:
pid = item['parent_id']
if pid:
# 一次就找到了需要在 msg_list 中循环才能找到的数据(原理是数据引用)
msg_list_dic[pid]['children'].append(item)
else:
result.append(item)
# print(msg_list)
for v in msg_list:
print(v)
出现...说明是循环引用了,把 i['children'].append(item) 改成 i['children'].append(item.copy()) 应该就好了。意思是拷贝一份新的存进去
######感谢您的解答,问题解决了,再次感谢!######是不是这样好点?
for item in msg_list:
if item['parent_id']:
for i in msg_list:
if item['parent_id'] == i['id']:
i['children'].append(item)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。