如何检查两个变量是否引用同一个对象?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
答案 0 :(得分:110)
这就是is
的用途:如果x is y
和True
是同一个对象,则x
会返回y
。
答案 1 :(得分:11)
y is x
将为True,y is z
将为False
。
答案 2 :(得分:8)
虽然两个正确的解决方案x is z
和id(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来查看内存的分配方式以及引用内容的原因。
添加了这个真棒gif,因为这个回复是关于可视化..
答案 5 :(得分:1)
这是来自docs.python.org:"每个对象都有一个标识,一个类型和一个值。对象的标识一旦创建就永远不会改变;您可能会将其视为内存中对象的地址。 'is'运算符比较两个对象的身份; id()函数返回一个表示其身份的整数。"
显然,每次更改值时,都会重新创建对象,如标识更改所示。线x = 3后面的线x = 3.14没有给出错误&为x提供不同的身份,类型和值。