python is 和 == 区别

直接上个栗子

>>>a = 256
>>>b = 256
>>>a is b 
True	
>>>a == b
True

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

两次执行结果,为什么不相同?

  1. is 运算符检查两个运算对象是否引用自同一对象 (即, 它检查两个对象的内存地址是否相同).
  2. == 运算符比较两个运算对象的值是否相等.
    因此,无论a, b取何值,只要值相等,结果就为True
    >>>[] == []
    True
    

为什么a, b>256时,内存地址不一样?

  1. 小整数池
    在python编程中,为了优化程序的执行效率,python使用了一个叫做小整数对象池的东东。由于程序会频繁使用一些整数,有了这个小整数对象池,就会把小整数常驻内存不会被垃圾回收机制处理,避免了频繁地在内存中创建和销毁整数带来的耗费

    小整数对象池,其实就是一个指针数组,该数组的大小为262(257+5),表示的小整数的范围为[-5,257)(包括-5,不包括257),即是说该数组包含了指向这262个小整数的指针

  2. 因此,只要整数数值在[-5, 257)之间, 内存地址都会相等

    >>>a=-5
    >>>b=-5
    >>>a is b
    True
    
  3. 对于字符串,Python也有类似的机制,可以了解一下python字符串驻留机制

下面来看个奇怪的栗子

>>>a=300
>>>b=300
>>>a is b
False

>>>c=300;d=300
>>>c is d
True

>>>id(d)
2445157327408
>>>id(c)
2445157327408

变量abcd的数值都超过了257,理论上各自的内存地址不一样,但为什么cd的内存地址一样?

  1. cd 在同一行中被设置为 300时, Python 解释器会创建一个新对象, 然后同时引用第二个变量. 如果你在不同的行上进行, 它就不会 “知道” 已经存在一个 300对象了.
  2. 这是一种特别为交互式环境做的编译器优化. 当你在实时解释器中输入两行的时候, 他们会单独编译, 因此也会单独进行优化. 如果你在 .py 文件中尝试这个例子, 则不会看到相同的行为, 因为文件是一次性编译的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值