Python中几个容易混淆的概念(==,is,type,isinstance)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值