1、“==”是比较对象的值是否相同
>>> a = 1
>>> b = 1
>>> print(a == b)
True
2、"is"是判断参与比较的两个对象是否为同一个(地址是否相同)
>>> a = 12345
>>> b = 12345
>>> print(a is b)
False
a和b的值都是12345,但属于不同的对象。因此使用"is"判断时,返回False。这里,我们可以进一步通过id()这个函数查看a和b对应值的地址。
>>> a = 12345
>>> b = 12345
>>> print(id(a))
2281569830096
>>> print(id(b))
2281569830960
然而,事情并没有那么简单。如果我们尝试将a和b的值换成一个小一点的数,会发现他们指向的对象居然是同一个。
>>> a = 1
>>> b = 1
>>> print(a is b)
True
>>> print(id(a), id(b))
140735729531968 140735729531968
这是因为,python处于性能的考虑,将我们经常使用的一些整数和字符做了处理,即不管你创建多少个整数1,其实都是指向同一个。这样就节约了内存。
就当我们以为这个问题已经结束时,你愉快地打开pycharm(其他工具没试过),输入代码。你会发现出现又出现违反规律的结果。不是说只针对小整数和短字符做特殊处理吗?怎么12345也只创建一个对象呢。原因在于,python处于性能考虑,特殊处理了一些小整数和段字符;同样,pycharm也会出于性能考虑,对更多的情况做特殊处理。
后面说的这些特殊情况,其实和中心思想并不违背。即"is"是判断对象是否为同一个,如果觉得迷糊,记住这一个结论就行。
3、"type" 返回对象对应的类(直接)
class A:
pass
class B(A):
pass
b = B()
print(type(b) is B)
# type只会往上查询一级
print(type(b) is A)
# True
# False
虽然B类继承了A类,但是type只会往上查询一级。如果想一查到底,只要有一丝联系就返回True。那就要使用isinstance
4、"isinstance" 按照mro顺序查询继承关系
class A:
pass
class B(A):
pass
b = B()
print(isinstance(b, B))
print(isinstance(b, A))
# True
# True