比较两个变量是否引用相同对象在Python中

134 投票
6 回答
73490 浏览
提问于 2025-04-16 14:29

如何检查两个变量是否指向同一个对象?

x = ['a', 'b', 'c']
y = x                 # x and y reference the same object
z = ['a', 'b', 'c']   # x and z reference different objects

6 个回答

13

这里的意思是,y是x的结果会是True,也就是说y和x是同一个东西。而y是z的结果会是False,说明y和z不是同一个东西。

23

虽然之前已经有人提到过两个正确的解决方案 x is zid(x) == id(z),但我想强调一下Python的一个实现细节。Python把整数当作对象来存储,为了提高效率,它在一开始就生成了一些小整数(从-5到256),并且把每个持有这些小整数的变量都指向这些预先初始化的对象。更多信息

这意味着,对于初始化为相同小数字(-5到256)的整数对象,检查这两个对象是否相同会返回真(在C-Python中,据我所知这是一个实现细节),而对于更大的数字,只有当一个对象是从另一个对象初始化时,这个检查才会返回真。

> i = 13
> j = 13
> i is j
True

> a = 280
> b = 280
> a is b
False

> a = b
> a
280
> a is b
True

注意:在交互式终端和脚本之间,这种行为可能会有所不同。比如,pythontutor提到:

对于字符串和数字,你不能依赖于id()或is在你的电脑上表现得和CPython完全一样(示例);在教初学者时,永远不要依赖这些,因为它们是特定于实现的,并且在REPL和脚本之间会有所不同。

这个回答提到了整数,关于字符串可以看看字符串驻留,例如这个讨论是相关的。

193

这就是 is 的作用。

在这个例子中,x is y 返回 True,因为它们是同一个对象,而 x is z 返回 False,因为它们是不同的对象(虽然它们里面的数据是一样的)。

撰写回答