You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python将for循环生成嵌套字典的代码封装为函数后无法返回预期结果

问题成因
  • 不必要的locals()动态变量操作带来的异常行为:Python函数内部的locals()返回的是当前局部命名空间的快照拷贝,而非可直接写入的引用。你通过locals()['MSC' + sub]创建动态变量的写法完全没有必要,反而会因为命名空间的读写限制导致字典赋值异常,属于不必要的多余操作。
  • 异常处理逻辑完全失效:你的except代码块中只有一个无意义的字符串字面量"couldn't load",没有任何实际处理逻辑。如果nib.load()加载文件失败,mean_brain变量不会被定义,后续执行mean_brain.get_data()时会直接抛出异常,而你用了无差别的except捕获了所有异常,甚至包括这行代码的报错,导致你看不到实际错误,误以为代码正常运行。
  • 函数返回值未接收:你在调用CreateDict(sub)时没有把返回值赋值给变量,函数执行完成后返回的字典直接被丢弃,自然拿不到结果。
解决方法

直接抛弃冗余的locals()动态变量写法,直接用普通字典存储结果,同时修复异常处理逻辑,调用时接收返回值即可。
修正后的完整代码如下:

import nibabel as nib

def CreateDict(sub):
    # 直接初始化普通字典,不需要动态创建变量名
    msc_dict = {}
    seeds = ["aHPC", "pHPC", "FPl", "FPm", "ERC", "PHC", "PRC", "46"] 
    masks = ["whole", "ERC", "PFl", "FPm"] 
    hemispheres = ["R", "L"] 
    sessions = ["01", "02"] 
    for hemi in hemispheres:
        for seed in seeds:
            for mask in masks:
                current_pair = f"{hemi}_{seed}_{mask}"
                msc_dict[current_pair] = {}
                for ses in sessions:
                    input_dir = f"/1D_fc/{sub}_{ses}/"
                    mean_fn = f"{input_dir}R.Fim.{hemi}_{seed}_{mask}.nii.gz"  
                    try:
                        mean_brain = nib.load(mean_fn)
                    except Exception as e:
                        # 打印实际报错信息方便排查,也可以根据需求跳过该条数据
                        print(f"加载文件{mean_fn}失败,错误信息:{str(e)}")
                        # 加载失败的话可以给对应位置赋值None,避免后续报错
                        msc_dict[current_pair][ses] = None
                        continue
                    mean_data = mean_brain.get_fdata()  # 注意旧版get_data()已被弃用,推荐用get_fdata()
                    meanDataVector = mean_data.ravel()
                    msc_dict[current_pair][ses] = meanDataVector
    return msc_dict

sub = "01"
# 调用函数时接收返回值
msc_01 = CreateDict(sub)

内容的提问来源于stack exchange,提问作者Catherine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:54:03