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
相关产品推荐
相关产品推荐

