为什么我的字典在dict理解构造函数中被删除?

问题描述

我在另一种的dict理解构造中引用了一个protocol_dict的字典:

    for drug_id in drug_dict.keys():
        drug_name = Drugs.get_drug_name_from_id(drug_id)
        
        # Error happens here:
        frontend_forward_dict[drug_name] = {pid: protocol_dict[pid] for pid in drug_dict[drug_id]}

运行此代码时,收到错误消息,提示protocol_dict未定义。而且,很明显,而且,当我调试代码时,我可以验证python是否有protocol_dict的存储值,直到运行dict理解为止。但是dict理解会在第一次调用时抛出此错误

当我用for构造函数代替dict理解时,问题消失了,一切都按预期进行了:

    for drug_id in drug_dict.keys():
        drug_name = Drugs.get_drug_name_from_id(drug_id)
        target_dict = {}
        for pid in drug_dict[drug_id]:
            target_dict[pid] = protocol_dict[pid]
        frontend_forward_dict[drug_name] = target_dict

有人知道这里发生了什么吗?如果有用,这是protocol_dict的定义:

protocol_dict = {}
    for p,val in protocol_data.items():
        versions = []
        if len(val) == 1:
            if "VERSION NUMBER" in val[0]["Metadata"].keys():
                vers = val[0]["Metadata"]["VERSION NUMBER"]
                versions.append(vers)
            else:
                versions.append("-1")
        else:
            # Multiple versions. Can assume each one comes with the right tag.
            for version in val:
                vers = version["Metadata"]["VERSION NUMBER"]
                versions.append(vers)
        protocol_dict[p] = versions

解决方法

protocol_dict 需要在使用它的代码之前定义。

是在同一个文件中定义的,还是导入的?

如果它在同一文件中,则它必须在同一范围内,您可能正在定义 protocol_dict ,以使试图使用它的代码看不到它

dict理解没有什么神奇的,您可以通过运行以下代码段对其进行测试:

foo = dict(a=1,b=2)
print({x: foo[x] for x in "ab"})