python3 嵌套循环同一个字典,尽然循环出 3 个点点,百思不得其解!引用数据类型出错, WHY?

2018-08-30 08:36:21 +08:00
 mishi200
描述:如下 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)
515 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/484429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX