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

pic*_*c11 86 python

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

x = ['a', 'b', 'c']
y = x                 # x and y reference the same object
z = ['a', 'b', 'c']   # x and z reference different objects
Run Code Online (Sandbox Code Playgroud)

Joc*_*zel 119

is就是:x is y返回Trueif xy是同一个对象.

  • @Bill:这是python如何处理整数的人工制品.Python分配`x`和`z`指向的整数对象.由于小整数是常见的失败(-1作为错误值,每当你实际索引某些东西时为0,小数字通常是合理的默认值)Python通过预先分配小数字(-5到256)并重用相同的整数对象来优化.因此,您的示例仅适用于此范围内的数字.尝试分配更大的东西,即"270".有关详细信息,请参阅[此处](http://www.laurentluce.com/posts/python-integer-objects-implementation/) (11认同)
  • 在示例中,`x is z`返回`False`.但是如果为x和z分配相同的值而不是列表(例如`x,z = 13,13`),那么`x is z`将返回`True`.这是为什么? (4认同)
  • @AndresR 不,那是错的。`is` 检查两个名称是否引用相同的内存位置。它与对象本身无关。拥有不可变对象(如相等但不存储在同一位置的字符串)很容易,例如,`''a'*10000 是 'a' * 10000` 是 False。 (3认同)
  • @JochenRitzel 你说得对,谢谢你的评论!那么,我不明白 `"af" is "af"` 或 `() is ()` 发生了什么......为什么它们共享相同的内存位置? (2认同)
  • @AndreasR对于代码中的文字字符串/数字,编译器会检查它们仅存在一次并重用它们。特殊值(例如(),None,True,False等)也定义为单例。在执行期间,运行时还会尝试重用少量数字和字符串,但最终要在速度和内存之间进行权衡,发生的事情取决于Python运行时的实现方式。 (2认同)

Mar*_*off 12

y is x将是真的,True将是y is z.


ted*_*ted 9

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

这意味着对于初始化为相同小数(-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
Run Code Online (Sandbox Code Playgroud)


Bil*_*ill 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)
Run Code Online (Sandbox Code Playgroud)