如何在单次定义Python字典时将其键存入字典中?
实现字典键引用自身键集合的方案
这个需求确实有点巧——想让字典里的一个键值直接对应自身的键集合,还希望只定义一次字典,不用分步赋值或者存字符串再eval的方法对吧?我来给你梳理几个可行的思路:
为什么直接写d = {"a": d.keys()}不行?
首先得说清楚,直接这么写会触发NameError,因为在构造字典的过程中,变量d还没有被完成赋值,此时引用d相当于引用一个未定义的变量,这就是你觉得接近递归定义的原因。
方案1:一行完成静态赋值(Python 3.8+)
如果只需要在定义字典时,让"a"的值等于当时的键集合(后续字典变化不要求更新"a"的值),可以用Python 3.8引入的赋值表达式(海象运算符),在同一个表达式里完成字典的创建和引用:
d = {"a": (d := {"a": None}).keys()}
执行后d的值是{"a": dict_keys(['a'])},刚好符合你的需求,而且是一行代码完成字典定义。
方案2:动态更新的字典(支持后续键变化)
如果希望后续给字典添加新键时,d["a"]能自动同步最新的键集合,那可以自定义一个字典子类,让它初始化时自动把"a"绑定到自身的键视图上:
class SelfKeyDict(dict): def __init__(self): super().__init__() self["a"] = self.keys() # 一次定义完成 d = SelfKeyDict()
这样创建的d,d["a"]是Python的动态键视图,当你执行d["b"] = 1后,d["a"]会自动变成dict_keys(['a', 'b']),完全满足动态同步的需求。
关于你之前的尝试
- 用
eval的方法确实不够优雅,不仅需要手动触发求值,还存在安全风险(如果字符串来源不可信的话); - 分步定义的方法可行,但确实不符合你“仅定义一次字典”的期望,上面的两个方案都能规避这个问题。
内容的提问来源于stack exchange,提问作者Tom Cupis
相关产品推荐
相关产品推荐

