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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:01:22