如何在Python中判断一个变量是否引用另一个已声明的对象?
问题场景
打印变量的类型只会返回其指向数据的类型:
i = [5,6,7,8] j = i print(type(j))
输出结果:
<class 'list'>
由于j引用了可变类型的对象,修改j会直接影响原对象,因此:
j[0] = 3 print(i) print(j)
输出结果:
[3, 6, 7, 8] [3, 6, 7, 8]
需求:需要实现一个函数,传入j时返回True,传入i时返回False,求可行方案或内置函数。
解决方案
Python中变量本质是对象的引用,i和j指向同一个列表对象,无法通过对象本身区分两个变量。要实现需求,可通过以下两种方式:
方法1:通过inspect模块识别变量名
借助inspect模块获取调用上下文里的变量名,判断是否为目标名称:
import inspect def is_target_var(var): # 获取上层调用栈的局部变量 caller_frame = inspect.currentframe().f_back # 遍历局部变量,找到对应传入的变量名 for name, value in caller_frame.f_locals.items(): if value is var: return name == 'j' return False # 测试 i = [5,6,7,8] j = i print(is_target_var(i)) # 输出 False print(is_target_var(j)) # 输出 True
局限性:依赖变量名,若有其他变量(如k = i)指向同一对象,会返回False;跨作用域调用时可能无法正确识别变量名。
方法2:手动标记原始对象
给原始对象添加自定义属性,通过判断属性区分:
# 创建原始对象并添加标记 i = [5,6,7,8] i._is_original = True j = i def is_original(var): return hasattr(var, '_is_original') and var._is_original # 测试 print(is_original(i)) # 输出 True print(is_original(j)) # 输出 False
优势:不依赖变量名,更可靠;只要是原始对象的引用,都能正确区分。
内容的提问来源于stack exchange,提问作者Timothy Oh
相关产品推荐
相关产品推荐

