is和==的区别、Python的小整数池、*和*的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了is和==的区别、Python的小整数池、*和*的区别相关的知识,希望对你有一定的参考价值。
参考技术A• 一、is和==的区别?•二、延伸问题•三、*和**区别?
为什么会这样呢?
小整数池目的:节省内存,提高执行效率。
Python中的一切东西皆为对象,那么每次给变量赋值是不是都需要新建一个对象呢?
实际编程过程中,像1、3、5这样的整数的使用频率比整数10000、11000使用更为频繁,对于低频整数每次都创建空间可能对于程序的性能影响并不大,但是对于较小的整数,由于其使用频率非常高,所以每次申请赋值都需要为其分配一个新的空间,无疑会大大降低程序的效率。
对于这个问题,Python明智地将整数分成了小整数和大整数两种类型,对于两种不同类型的数据分别采取了不同的方案:
小整数:将这部分有限的整数缓存于内存中,可共享。
大整数:将其放入使用单链表维护的对象池中,非共享,即每次创建都需要为其分配一块新的内存,即使内存中已经存在相同的整数。
需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256]。
该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
另外创建变量的值如果相同的话,创建的时间间隔又比较短,那么他们的内存空间的值是相同的。
在Pycharm中运行Python程序时,Pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
单个* 号:1.表示乘号;2.表示倍数;3.(1) 单个*表示接受任意多个参数并将其放在一个元组中 ;(2)函数在调用多个参数时,在列表、元组、集合、字典及其他可迭代对象作为实参,并在前面加 *
如 *(1,2,3)解释器将自动进行解包然后传递给多个单变量参数(参数个数要对应相等)。
两个*号:
用于接收类似于 关键参数 一样赋值的形式的多个实参放入字典中(即把该函数的参数转换为字典)。
python字符串,赋值和is的区别
1. == 与 is 的区别
赋值 == 比较值是否相等,is 比较,比较的是内存地址。
小数据池的作用是节省内存空间
数字的范围:-5 到 256 共用一个数据池
字符串范围:1.不能有特殊字符。2. s*20还是同一个地址,超过以后就是不用地址 3.不同字符超过20仍然is
剩下的 列表,元祖等没有小地址池
2. python3中的编码
ascii 一个字符1个字节,占8位 A:00000010 unicode 一个字符4个字节,占32位 A:00000000 00000001 00000010 00000010 中: utf-8 一个英文字符,8位 一个中文字符,占24位 gbk A:一个字符,8位 中:一个中文字符,16位 1.各个编码2 进制不能识别,会产生乱码 2.文件的存储和传输不能是unicode
3.python中的bytes类型
‘‘‘ 对于英文: str: 表现形式: s = ‘alex‘ 编码方式: 01010101 unicode bytes: 表现形式: s = b‘alex‘ 编码方式: 01010101 utf-8 gbk 对于中文: str: 表现形式: s = ‘中国‘ 编码方式: 01010101 unicode bytes: 表现形式: s = b‘xe91e91e01e21e31e32‘ 3字节表示一个中文,utf-8;若2个字节1个汉字,gbk 编码方式: 01010101 utf-8 gbk ‘‘‘ s1 = ‘alex‘ # 将 unicode 转换成utf-8 或gdk,表现形式是将str 转换成bytes, # encode 编码,如何将str --> bytes, s11 = s1.encode(‘utf-8‘) print(s11)
以上是关于is和==的区别、Python的小整数池、*和*的区别的主要内容,如果未能解决你的问题,请参考以下文章