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

如何使相同值的不同变量指向不同对象?

如何让相同值的变量指向不同对象(拥有不同id)

嘿,这个问题挺有意思的!虽然日常开发里确实几乎用不上这种需求,但既然你好奇想搞明白,咱们来聊聊具体怎么实现~

首先得明确:Python对小整数、短字符串这类不可变内置类型做了缓存优化,目的是节省内存,所以相同值的变量会默认指向同一个对象。要避开这个缓存,核心思路就是绕开内置类型的缓存机制,让每个变量对应独立的对象。

下面给你几个可行的方法:

方法1:用自定义类包装值

最通用的方式是写一个简单的包装类,把你的值存成实例属性。每个类实例都是独立的对象,自然拥有不同的id,同时还能保持值的相等性:

class WrappedValue:
    def __init__(self, value):
        self.value = value

# 创建两个值相同但实例独立的对象
i = WrappedValue(5)
j = WrappedValue(5)

print(id(i))  # 输出一个唯一id
print(id(j))  # 输出另一个不同的id
print(i.value == j.value)  # 结果为True,值仍然相等

方法2:继承内置类型创建子类

对于特定的内置类型(比如int、str),你可以继承它创建一个子类。子类的实例不会触发内置类型的缓存机制,所以即使值相同,每个实例也是独立的:

class UniqueInt(int):
    pass

i = UniqueInt(5)
j = UniqueInt(5)

print(id(i) != id(j))  # 输出True,id不同
print(i == j)  # 输出True,值仍然相等

方法3:对可变类型做“无意义”修改(仅适用于可变类型)

如果是列表、字典这类可变类型,原本相同值的对象就会是独立的,但如果你想强制让两个看起来完全一样的可变对象id不同,其实直接创建新实例就行。比如:

i = [1,2,3]
j = [1,2,3]

print(id(i) != id(j))  # 输出True,本身就是不同对象

不过这个其实是可变类型的默认行为,主要是前面两种方法针对不可变类型的场景更有用。

总结一下:核心就是通过自定义结构(类、子类)避开Python内置的缓存优化,让每个变量对应独立的实例,从而拥有不同的id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:56