is和的区别Python的小整数池和的区别
目录
一、is和的区别?二、延伸问题三、和区别?一、is和的区别?是比较两个对象的内容是否相等,即两个对象的值是否相等,不管两者在内存中的引用地址是否一样。1。地址一样,值也一样,所以成立。qinghan1aqinghan2bqinghan3bqinghan4qinghan3print(qinghan1qinghan2,qinghan2qinghan3,qinghan3qinghan4)运行结果:FalseTrueTrue2。引用地址不一样,但是只要值一样,成立。val12000val22001val3val11print(id(val3)id(val2),val3val2)运行结果:FalseTrue3。对于类的实例比较classQinghan(object):definit(self,name,age):self。namenameself。ageagedefrun(self):print(canrun)a1Qinghan(Vtester,18)a2Qinghan(Vtester,18)a3a2print(id(a1)id(a2),a1a2)运行结果:FalseFalse注意这里a1和a2的值是不等的,虽然初始化创建对象格式一样。print(id(a2)id(a3),a2a3)运行结果:TrueTrueis比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。即is比较两个条件:1。内容相同。2。内存中地址相同。1。is成立的前提是内容相同,内存中地址相同。a1aa2ba3ba4a3print(a1isa2,a2isa3,a3isa4)运行结果:FalseTrueTrueprint(id(a1),id(a2),id(a3),id(a4))运行结果:25766089596562576608957976257660895797625766089579762。光值相同不行,内存地址也要相同,才会成立。
3。类实例的比较,也要内存地址一致。classQinghan(object):definit(self,name,age):self。namenameself。ageagedefrun(self):print(canrun)a1Qinghan(清菡,18)a2Qinghan(清菡,18)a3a2print(id(a1),id(a2),id(a3))运行结果是:203627153998420362715401522036271540152print(a1isa2,a2isa3)运行结果:FalseTrue二、延伸问题
为什么会这样呢?Python的小整数池
小整数池目的:节省内存,提高执行效率。
Python中的一切东西皆为对象,那么每次给变量赋值是不是都需要新建一个对象呢?
实际编程过程中,像1、3、5这样的整数的使用频率比整数10000、11000使用更为频繁,对于低频整数每次都创建空间可能对于程序的性能影响并不大,但是对于较小的整数,由于其使用频率非常高,所以每次申请赋值都需要为其分配一个新的空间,无疑会大大降低程序的效率。
对于这个问题,Python明智地将整数分成了小整数和大整数两种类型,对于两种不同类型的数据分别采取了不同的方案:
小整数:将这部分有限的整数缓存于内存中,可共享。
大整数:将其放入使用单链表维护的对象池中,非共享,即每次创建都需要为其分配一块新的内存,即使内存中已经存在相同的整数。
需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题,Python解释器会在启动时创建出小整数池,范围是〔5,256〕。
该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
另外创建变量的值如果相同的话,创建的时间间隔又比较短,那么他们的内存空间的值是相同的。
在Pycharm中运行Python程序时,Pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
三、和区别?
单个号:1。表示乘号;2。表示倍数;3。(1)单个表示接受任意多个参数并将其放在一个元组中;(2)函数在调用多个参数时,在列表、元组、集合、字典及其他可迭代对象作为实参,并在前面加
如(1,2,3)解释器将自动进行解包然后传递给多个单变量参数(参数个数要对应相等)。
两个号:
用于接收类似于关键参数一样赋值的形式的多个实参放入字典中(即把该函数的参数转换为字典)。