比较两个变量是否在python中引用同一个对象

时间:2011-03-26 20:27:39

标签: python

如何检查两个变量是否引用同一个对象?

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

6 个答案:

答案 0 :(得分:110)

这就是is的用途:如果x is yTrue是同一个对象,则x会返回y

答案 1 :(得分:11)

y is x将为True,y is z将为False

答案 2 :(得分:8)

虽然两个正确的解决方案x is zid(x) == id(z)我想指出python的实现细节。 Python将整数存储为对象,作为优化,它在其开始时生成一堆小整数(-5到256),并指向包含这些预初始化对象的小值整数的每个变量。 More Info

这意味着对于初始化为相同小数(-5到256)的整数对象,检查两个对象是否相同将返回true(ON C-Pyhon,据我所知这是一个实现细节),而对于较大的数字,如果一个对象从另一个对象初始化,则只返回true。

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

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

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

答案 3 :(得分:7)

您还可以使用id()检查每个变量名称所指的唯一对象。

In [1]: x1, x2 = 'foo', 'foo'

In [2]: x1 == x2
Out[2]: True

In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)

In [4]: x2 = 'foobar'[0:3]

In [5]: x2
Out[5]: 'foo'

In [6]: x1 == x2
Out[6]: True

In [7]: x1 is x2
Out[7]: False

In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)

答案 4 :(得分:1)

我非常希望得到一个视觉反馈,这就是为什么我有时会打开http://www.pythontutor.com/visualize.html#mode=edit来查看内存的分配方式以及引用内容的原因。

enter image description here

添加了这个真棒gif,因为这个回复是关于可视化..

答案 5 :(得分:1)

这是来自docs.python.org:"每个对象都有一个标识,一个类型和一个值。对象的标识一旦创建就永远不会改变;您可能会将其视为内存中对象的地址。 'is'运算符比较两个对象的身份; id()函数返回一个表示其身份的整数。"

显然,每次更改值时,都会重新创建对象,如标识更改所示。线x = 3后面的线x = 3.14没有给出错误&为x提供不同的身份,类型和值。