如何以更优雅通用的方式在Python中用变量填充字典(无需引号写变量名)
优雅通用的Python字典填充方案
嘿,这个需求太戳日常开发的痛点了——手动把变量名重复写进引号当键名不仅繁琐,还容易因手滑写错,尤其是变量多的时候。下面给你几种通用又优雅的实现方式:
方法1:字典推导式+变量列表(灵活可控)
如果你明确知道要把哪些变量放进字典,可以先列出变量名,再用推导式生成字典,彻底避免重复写键名:
fruit = 'apple' vegetable = 'potato' # 只需要在这里指定要包含的变量名 target_vars = ['fruit', 'vegetable'] food_dict = {var: locals()[var] for var in target_vars}
这种方式的优势是灵活,后续要加新变量,直接在target_vars列表里追加就行,不用修改字典赋值的核心代码。
方法2:利用局部变量字典(适合函数内场景)
如果是在函数内部,且当前作用域里只有你需要的变量,可以直接用vars()或locals()获取局部变量字典,一步到位:
def build_food_dict(): fruit = 'apple' vegetable = 'potato' # 返回当前函数的局部变量字典 return vars() food_dict = build_food_dict() # 输出结果: {'fruit': 'apple', 'vegetable': 'potato'}
⚠️ 注意:如果在全局作用域使用locals(),会返回全局变量字典,可能混入很多无关变量,所以更适合函数内部这种封闭作用域。
方法3:Python 3.8+ 海象运算符(简洁合并赋值)
如果你用的是Python 3.8及以上版本,可以用海象运算符把变量定义和字典填充合并在一起,减少冗余代码:
food_dict = { 'fruit': fruit := 'apple', 'vegetable': vegetable := 'potato' }
虽然还是写了键名,但不用单独写变量赋值的行,把两步操作合并成了一步,代码更紧凑。
方法4:自定义工具函数(通用复用)
如果经常需要做这种变量转字典的操作,可以写一个小工具函数,利用inspect模块自动获取调用者的局部变量,用起来更省心:
import inspect def vars_to_dict(*var_names): # 获取调用者的局部变量字典 caller_locals = inspect.currentframe().f_back.f_locals return {name: caller_locals[name] for name in var_names} # 使用示例 fruit = 'apple' vegetable = 'potato' food_dict = vars_to_dict('fruit', 'vegetable')
这个函数可以在任何地方复用,调用时只需要传变量名字符串就行,不用写推导式,非常方便。
避坑提醒
- 尽量别直接用
globals(),全局作用域变量太多,很容易混入无关内容。 - 如果是类实例中的属性,可以用
self.__dict__获取属性字典,但记得过滤掉不需要的内置属性。
内容的提问来源于stack exchange,提问作者Egirus Ornila
相关产品推荐
相关产品推荐

