Python中“is”和“==”的区别(避坑)

2.3 “is”和“==”的区别

在Python编写代码时,经常会遇到需要判断2个对象是否相等的情况,这个时候一般就会想到使用is==is==好像都可以用来判断对象是否相等,经常会傻傻分不清,但其实这其中还是有区别的。
不过在这之前,我们得先了解一些基本知识。
①、在Python中,一切皆对象,比如变量、函数等,都是对象。对象包含3个基本要素:

  • id:身份标识
  • type:数据类型
  • value:值
    ②、在Python中,根据对象的值能否原地修改,分为可哈希和不可哈希。能原地修改的是不可哈希对象,不能原地修改的是可哈希对象。Python常见对象(类型)哈希状态如下:
对象(类型) 哈希
数字 可哈希
字符串 可哈希
列表 不可哈希
元组 可哈希
集合 不可哈希
字典 不可哈希

③、在Python中,变量的赋值其实就是贴标签,重新赋值后并不会直接修改变量的值,而是将变量重新指向新的赋值对象。关于这一点请看下面的例子:

from icecream import ic
a = 'A'
b = 'B'
ic(a, id(a), id(b))
a = 'B'
ic(a, id(a))

ic| a: ‘A’, id(a): 1897621655920, id(b): 1897659140592
ic| a: ‘B’, id(a): 1897659140592

④、在Python中,可哈希对象的值一样,那么其标识符(id)也一样。请看下方的例子:

from icecream import ic
a = 'ABC'
b = 'ABC'
ic(id(a), id(b))
ic(id(a) == id(b) == id('ABC'))
c = d = 'DEF'
ic(id(c), id(d))
ic(id(c) == id(d) == id('DEF'))
a = b = c
ic(id(a), id(b), id(c))
ic(id(a) == id(b) == id(c))

ic| id(a): 2682794608816, id(b): 2682794608816
ic| id(a) == id(b) == id(‘ABC’): True
ic| id©: 2682822597040, id(d): 2682822597040
ic| id© == id(d) == id(‘DEF’): True
ic| id(a): 2682822597040, id(b): 2682822597040, id©: 2682822597040
ic| id(a) == id(b) == id©: True

在Python中,==是比较操作符,用来比较两个对象的值是否相等。判断时,相当于调用了对象中的__eq__()方法,即:对象1 == 对象2  对象1.eq(对象2)。
is是同一性运算符,用来判断两个对象的标识符(id)是否一致。即:对象1 is 对象2  id(对象1) == id(对象2)。
对于可哈希对象,由于值一样,则标识符(id)必定一样,is==的结果始终保持一致。
而对于不可哈希对象,就算两个对象的值一样,他们的标识符(id)也不一样。导致is==的结果不一样。如下所示:

from icecream import ic
a = ['ABC']
b = ['ABC']
ic(id(a), id(b))
ic(a is b)
ic(id(a) == id(b) == id(['ABC']))
c = d = ['DEF']
ic(id(c), id(d))
ic(c is d)
ic(id(c) == id(d) == id(['DEF']))
a = b = c
ic(id(a), id(b), id(c))
ic(a is b, b is c)
ic(id(a) == id(b) == id(c))

ic| id(a): 1115121876032, id(b): 1115122037184
ic| a is b: False
ic| id(a) == id(b) == id([‘ABC’]): False
ic| id©: 1115122601024, id(d): 1115122601024
ic| c is d: True
ic| id© == id(d) == id([‘DEF’]): False
ic| id(a): 1115122601024, id(b): 1115122601024, id©: 1115122601024
ic| a is b: True, b is c: True
ic| id(a) == id(b) == id©: True

猜你喜欢

转载自blog.csdn.net/crleep/article/details/130402600