开发者社区> 问答> 正文

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

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)

展开
收起
爱吃鱼的程序员 2020-06-03 15:46:01 531 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    出现...说明是循环引用了,把 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)

    ######for item in msg_list: if item['parent_id']: for i in msg_list: if item['parent_id'] == i['id']: i['children'].append(item.copy()) 再加个字典的copy方法就完美了!!!
    2020-06-03 17:21:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载