Python代码query_words长度大于1时出现非预期输出的修复方法
Python多查询词场景字典引用共享问题修复
问题现象
运行如下Python代码时,多查询词场景下输出结果与预期不符:
query_words = ['dollar', 'probabilistic'] query_word_to_synonym_dict = {'probabilistic': ['probabilistic'], 'dollar' : ['currency']} mail_ids = {123, 108} big_ds = {} empty_dict = {} index = {'probabilistic':{(108, 1)}, 'currency':{(123, 1)}} for mail_id in mail_ids: empty_dict = dict.fromkeys(query_words, []) big_ds.update({mail_id:empty_dict}) for query_word in query_words: syns = query_word_to_synonym_dict[query_word] for syn in syns: index_of_word = index[syn] tuple_first = [] for tuples in index_of_word: tuple_first.append(tuples[0]) for number in tuple_first: (big_ds[number][query_word]).append(syn) print(big_ds)
- 预期输出:
{123: {'dollar': ['currency'], 'probabilistic': []}, 108: {'dollar': [], 'probabilistic': ['probabilistic']}} - 实际输出:
{123: {'dollar': ['currency'], 'probabilistic': ['currency']}, 108: {'dollar': ['probabilistic'], 'probabilistic': ['probabilistic']}}
单查询词场景下代码运行正常,当query_words长度大于1时结果异常。
问题根因
问题出在字典初始化的dict.fromkeys(query_words, [])语句:dict.fromkeys()方法的第二个参数如果传入可变对象(比如列表、字典),所有字典键会共享同一个对象实例的引用,不会为每个键单独创建新的空列表。
单查询词场景下字典只有一个键,引用共享的问题不会暴露;当存在多个查询词时,同一个邮件id下的dollar和probabilistic两个键指向完全相同的列表对象,往任意一个键对应的列表追加内容,另一个键的列表也会同步变化,最终导致结果不符合预期。
修复方法
将字典初始化逻辑替换为字典推导式,为每个查询词单独生成独立的空列表,避免引用共享。
把原初始化循环:
for mail_id in mail_ids: empty_dict = dict.fromkeys(query_words, []) big_ds.update({mail_id:empty_dict})
修改为:
for mail_id in mail_ids: empty_dict = {word: [] for word in query_words} big_ds[mail_id] = empty_dict
修改后运行代码,即可得到预期输出。
内容的提问来源于stack exchange,提问作者jj050102
相关产品推荐
相关产品推荐

