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

字典推导中访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:12:37