Skip to content

身份运算符:深入理解Python对象

在Python的世界里,一切皆对象。当你创建一个变量并赋值时,实际上是在内存中创建了一个对象,并将变量名指向这个对象。理解对象之间的关系是掌握Python的关键一步。

我们之前学过的关系运算符 == 主要用于比较两个对象的值是否相等。但有时候,我们不仅关心值是否相等,更关心这两个变量是否指向同一个对象,也就是它们在内存中的位置是否相同。这时,就需要用到身份运算符了。

isis not:探索对象的身份

Python提供了两个身份运算符:isis not。它们用于比较两个对象是否具有相同的身份(identity),即是否指向内存中的相同位置。

  • is 运算符: 如果两个变量指向同一个对象,则返回 True,否则返回 False
  • is not 运算符: 如果两个变量指向不同的对象,则返回 True,否则返回 False

简单来说,a is b 等价于 id(a) == id(b)。这里的 id() 是一个内置函数,它返回一个对象的唯一身份标识,通常是对象在内存中的地址。

python
>>> a = 256
>>> b = 256
>>> a == b  # 比较值是否相等
True
>>> a is b  # 比较是否是同一个对象
True

>>> a = 257
>>> b = 257
>>> a == b
True
>>> a is b
False

注意: 为什么 a=256b=256 时,a is b 返回 True,而 a=257b=257 时,返回 False呢? 这是因为Python为了优化性能,对于小整数(通常是-5到256)会使用intern机制,即在内存中只创建一个这样的整数对象,所有指向该值的变量都会指向这个对象。 超过这个范围的整数,每次赋值都会创建新的对象。

示例解析

让我们通过几个例子来更深入地理解 isis not 的用法:

python
>>> n = 10
>>> n2 = 10
>>> n == n2  # 值相等
True
>>> n is n2  # 是同一个对象(小整数的intern机制)
True

>>> l1 = [1, 2, 3]
>>> l2 = [1, 2, 3]
>>> l1 == l2  # 值相等
True
>>> l1 is l2  # 不是同一个对象,因为列表是可变对象,每次创建都会分配新的内存空间
False

>>> l3 = l1 # 将l1赋值给l3,l3和l1指向同一个对象
>>> l1 is l3
True

在上面的例子中,列表 l1l2 虽然包含相同的元素,但它们是两个独立的列表对象,存储在不同的内存位置。因此,l1 is l2 的结果为 False。 然而,当 l3 = l1 时,l3l1 指向了同一个列表对象,所以 l1 is l3 的结果为 True

身份运算符 isis not 用于比较两个对象是否是同一个对象(即内存地址是否相同),而关系运算符 == 用于比较两个对象的值是否相等。理解这两个运算符的区别,能帮助你写出更准确、更高效的Python代码。尤其是在处理可变对象(如列表、字典)时,更需要注意它们之间的区别。