字典推导中访问locals()内DataFrame触发KeyError问题排查
字典推导中访问locals()出现KeyError的原因与解决办法
问题重现
你在使用字典推导时,尝试将字典中的DataFrame与locals()中的对应DataFrame比较,却触发了KeyError。相关代码如下:
环境搭建代码
import numpy as np import pandas as pd df=pd.DataFrame(np.random.randint(3,size=[2,2]),columns=['A','B']) # A B # 0 1 2 # 1 2 0 # 创建DataFrame字典(此处仅包含一个) OldDFs={'df':df}
触发错误的关键代码
{ ky:locals()[ky] for (ky,OldDF1) in OldDFs.items() } # 控制台提示:KeyError 'df'
测试确认键的类型正确,且推导外部访问locals()['df']、推导内访问其他字典都正常:
# 键类型正确 { ky:type(ky) for (ky,OldDF1) in OldDFs.items() } # {'df': str} # 推导内访问其他字典正常 { ky:OldDFs[ky] for (ky,OldDF1) in OldDFs.items() } # 正常输出df # 推导外部访问locals()正常 locals()['df'] # 返回对应的DataFrame
实际场景中你需要执行的测试代码:
{ ky:OldDF1.equals(locals()[ky]) for (ky,OldDF1) in OldDFs.items() }
问题原因
Python的字典推导会创建独立的局部作用域,推导内部调用的locals()指向的是这个内部作用域的命名空间,而非外部代码的命名空间。外部的df变量不在推导内部的locals()里,所以会抛出KeyError。
解决办法
方法1:提前保存外部的locals()
在推导前把外部的局部命名空间存到一个变量中,推导内使用这个变量即可:
# 提前保存外部的locals() outer_locals = locals() # 正常执行的推导 { ky: outer_locals[ky] for (ky, OldDF1) in OldDFs.items() } # 对应实际场景的测试代码 { ky: OldDF1.equals(outer_locals[ky]) for (ky, OldDF1) in OldDFs.items() }
方法2:使用globals()(如果变量是全局的)
如果你的df是全局变量,直接用globals()替代locals(),因为globals()始终指向全局命名空间:
{ ky: globals()[ky] for (ky, OldDF1) in OldDFs.items() } # 实际场景测试代码 { ky: OldDF1.equals(globals()[ky]) for (ky, OldDF1) in OldDFs.items() }
方法3:提前构建目标变量字典
如果只需要特定的变量,可以手动构建包含这些变量的字典,避免依赖locals()/globals():
# 手动构建需要的变量字典 target_dfs = {'df': df} { ky: OldDF1.equals(target_dfs[ky]) for (ky, OldDF1) in OldDFs.items() }
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

