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

使用变量作为键创建Python字典出现KeyError,求排查原因

问题分析与解决方案

咱们来一步步拆解这个问题,为什么会抛出KeyError,以及怎么修复它:

1. 最核心的问题:传入的是变量值,不是变量名

你调用create_dict(a, d)的时候,传递给函数的是变量a和d的实际值(也就是"Some Text"和当前的datetime对象),而不是变量名的字符串"a"、"d"。

函数里的locals()[i]试图在局部作用域里找以i为键的变量,但i现在是"Some Text"和那个时间对象,局部作用域里根本没有叫这个名字的变量,自然就抛出KeyError了。

2. 第二个问题:函数没有返回创建的字典

就算前面的问题解决了,你的create_dict函数里只是创建了字典,但没有用return返回它,调用后也拿不到预期的字典结果。

3. 额外问题:日期格式不符合预期

你预期的字典里日期是04-06-2018这种字符串格式,但datetime.now()返回的是datetime对象,直接存进去不会自动转换格式,需要用strftime手动处理。


修复后的代码

我们可以通过传递变量名字符串,结合全局作用域(因为a和d是函数外定义的全局变量)获取对应的值,同时添加return和日期格式化:

from datetime import datetime
a = "Some Text"
d = datetime.now().strftime("%d-%m-%Y")  # 先把日期格式化为预期的字符串格式

def create_dict(*args):
    return dict([(i, globals()[i]) for i in args])  # 用globals()取全局变量,同时return字典

result = create_dict("a", "d")  # 传入变量名的字符串,不是变量本身
print(result)

执行后就能得到你想要的结果:

{'a': 'Some Text', 'd': '04-06-2018'}

如果需要支持局部变量的场景,可以用inspect模块获取调用者的作用域,但对于当前这个简单场景,用globals()就足够简洁直接了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:28:41