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

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']

完全符合你想要的结果!

注意细节

  1. is vs ==:我这里用了is来匹配对象身份,这和你例子里的需求完全契合(区分字符串"2"和整数2这两个不同对象)。如果你的需求是匹配值相等而非同一个对象,可以把is换成==。
  2. 过滤内置/无关变量:locals()和globals()里会包含一些系统自动生成的变量(比如函数自身find_variable_names),如果不想把这些算进去,可以在列表推导里加过滤条件,比如排除以下划线开头的变量:
    local_hits = [name for name, val in locals().items() if val is target and not name.startswith('_')]
    
  3. 类/实例变量:如果要查找类或实例的属性名,那就用instance.__dict__(实例属性)或Class.__dict__(类属性)来替代globals()/locals()。

这种写法充分利用了Python的内置特性和列表推导的简洁性,完全符合Pythonic的“优雅、简洁、可读性强”的风格~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:46:10