Python中如何获取与指定对象关联的所有变量名?
当然有啦!Python里有非常贴合Pythonic风格的实现方式,核心就是利用命名空间的字典对象来反向查找对应值的变量名,用列表推导就能搞定,简洁又优雅。
核心思路
Python中,全局变量存在globals()返回的字典里,当前作用域的局部变量存在locals()返回的字典里——字典的键是变量名,值就是变量对应的对象。我们只需要遍历这些字典,筛选出值匹配目标对象的键即可。
示例实现
先定义几个测试变量:
a = 1 b = "2" c = 2 d = 2 e = "2"
然后写一个通用的查找函数:
def find_variable_names(target): # 先找局部作用域的匹配项,用列表推导筛选 local_hits = [name for name, val in locals().items() if val is target] # 再找全局作用域的匹配项 global_hits = [name for name, val in globals().items() if val is target] # 合并结果并去重(避免局部和全局有同名变量重复) return list(set(local_hits + global_hits))
测试效果
运行以下代码:
print(find_variable_names("2")) # 输出 ['b', 'e'] print(find_variable_names(2)) # 输出 ['c', 'd']
完全符合你想要的结果!
注意细节
isvs==:我这里用了is来匹配对象身份,这和你例子里的需求完全契合(区分字符串"2"和整数2这两个不同对象)。如果你的需求是匹配值相等而非同一个对象,可以把is换成==。- 过滤内置/无关变量:
locals()和globals()里会包含一些系统自动生成的变量(比如函数自身find_variable_names),如果不想把这些算进去,可以在列表推导里加过滤条件,比如排除以下划线开头的变量:local_hits = [name for name, val in locals().items() if val is target and not name.startswith('_')] - 类/实例变量:如果要查找类或实例的属性名,那就用
instance.__dict__(实例属性)或Class.__dict__(类属性)来替代globals()/locals()。
这种写法充分利用了Python的内置特性和列表推导的简洁性,完全符合Pythonic的“优雅、简洁、可读性强”的风格~
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

