Python字典列表赋值后原嵌套字典值为空问题解决
问题根源
这是Python的对象引用赋值规则导致的,和你预期的“列表关联原字典、改列表就改原字典”的效果不匹配:
- 初始化
engines_container_overall时,列表里存的只是popular_search_terms下三个空OVERALL字典的内存引用,不是和原字典深度绑定的特殊入口 - 循环中执行
engines_container_overall[index] = df.get_popular_searchterms(False, engine)时,本质是把列表对应索引位置存储的引用替换成了新生成的DataFrame对象的地址,原来存的空字典引用被直接覆盖,全程没有修改popular_search_terms内部的原字典内容,所以原字典的值始终是初始化时的空字典 - 你打印
engines_container_overall[0]能拿到正确结果,只是因为列表当前位置存的是你新赋值的DataFrame,这个对象和原字典已经没有关联了
补充:如果你是对列表里存的字典做原地修改,比如写engines_container_overall[index]['test'] = 1,这种操作是会同步反映到原字典上的——因为此时你没有替换列表里的引用,只是修改了引用指向的字典对象的内部内容;但直接给列表索引位置赋全新的对象,就会切断和原对象的关联。
修复方法
方法1:直接操作原字典赋值(最推荐,逻辑最清晰)
没必要提前存一层引用列表,遍历的时候直接给原字典的对应键赋值即可:
from model.statistic_model import Sher, Op, Npp import pandas as pd TODAY = "today" OVERALL = "overall" SHER = "sherlock" OP = "oprisk" NPP = "npp" popular_search_terms = {SHER: {TODAY: {}, OVERALL: {}}, OP: {TODAY: {}, OVERALL: {}}, NPP: {TODAY: {}, OVERALL: {}}} engines = [Sher, Op, Npp] # 维护和engines顺序一一对应的业务键 engine_map_keys = [SHER, OP, NPP] try: for idx, engine in enumerate(engines): popular_search_terms[engine_map_keys[idx]][OVERALL] = df.get_popular_searchterms(False, engine) except Exception as e: print(e) for key in engine_map_keys: popular_search_terms[key][OVERALL] = pd.DataFrame()
执行完后直接访问popular_search_terms[SHER][OVERALL]就能拿到正确的值。
方法2:先构建中间列表,再同步回原字典
如果你确实需要单独用engines_container_overall这个列表做其他逻辑,可以先把列表的所有值填充完,最后统一同步到原字典:
engines_container_overall = [] try: for engine in engines: engines_container_overall.append(df.get_popular_searchterms(False, engine)) except Exception as e: print(e) engines_container_overall = [pd.DataFrame() for _ in engines] # 统一回写原字典 for idx, key in enumerate([SHER, OP, NPP]): popular_search_terms[key][OVERALL] = engines_container_overall[idx]
内容的提问来源于stack exchange,提问作者JohnDole
相关产品推荐
相关产品推荐

