一、小数据池
1、代码块
python程序是由代码块构成的。一个代码块的文本作为python程序执行的单元。代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块, eval()和exec()执行的时候也是一个代码块。
2、小数据池:一种数据缓存机制,也被成为驻留机制,它只针对整数、字符串、布尔值(不可变)其他数据类型不存在驻留机制。
在python中对-5 ~256之间的整数会被驻留在内存中,将一定规则的字符串缓存,在使用的时候,内存中只会创建一个该数据的对象,保存在小数据池中,当使用的时候直接从小数据池中获取对象的内存引用,而不需要创建一个新的数据,节省内存区域。 优点:能够提高一些字符串、整数的处理速度,省略创建对象的过程
缺点:在池中创建或者插入新内容会花费更多时间
3、针对数字、字符串
(1)数字:-5~256是会被加到小数据池中的,每次使用都是同一对象
(2)字符串:
<1>如果字符串的长度是0 或 1,都会默认进行缓存
<2>字符串长度大于1,但字符串中只含字母、数字、下划线时才会缓存
<3>用乘法得到的字符串,乘数为1,只含字母、数字、下划线时才会缓存,如果包含其他字符,而长度<=1也会被驻存。乘数大于 1,只含字母、数字、下划 线时才会缓存,但字符串长度<=20
<4>指定驻留,通过导入os模块
1 from sys import intern()2 a = intert('#$%^*fjewio')3 b = intert('#$%^*fjewio')
在代码块内的缓存机制是不一样的. 在执行同一个代码块的初始化对象的命令时, 会检查是否其值是否已经存在, 如果存在, 会将其重用. 换句话说: 执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中, 在遇到新的变量时, 会先在字典中查询记录, 如果有同样的记录那么它会重复使用这个字典中的之前的这个值. 所以在你给出的例子中, 文件执行时(同一个代码块) 会把a, b两个变量指向同一个对象.如果是不同的代码块, 他就会看这个两个变量是否是满足小数据池的数据, 如果是满足小数据池的数据则会指向同一个地址. 所以: a, b的赋值语句分别被当作两个代码块执行, 但是他们不满足小数据池的数据所以会得到两个不同的对象, 因此is判断返回False.
二、is 和 ==的区别
1、id() #通过id()可以查看一个变量表示的值在内存中的地址。
2、is :判断左右两端内容的内存地址是否一致,如果返回True则两变量使用的是同一对象
3、== :判断左右两端的值是否相等,内容是不是一样的
内存地址相同,那么值一定是相等的,如果值相等,则不一定是同一个对象。
三、编码、解码
1、回顾
ASCII码 只有大小写字母、数字、一些特殊字符,没有中文,8 bit(1B)
GBK:中文编码里面包含ASCII,16bit(2B)
Unicode:万国码,32bit(4B)
UTF-8:可变长万国码,是Unicode的一种实现,最小字符占8位,英文8bit(1B)、欧洲 16bit(2B)、中文24bit(3字节)
除了ascii码以外,其他信息不能直接转换。
2、Unicode和utf-8
在python3的内存中,在程序运行阶段,使用的是Unicode编码,因为Unicode是万国码,什么内容都可以进行显示,那么在数据传输和储存的时候由于Unicode比较浪费空间和资源,需要把Unicode转存成utf-8或者GBK进行存储,在python中科院把文字信息进行编码,编码之后的内容就可以进行传输了,编码之后的数据是bytes类型数据
bytes的表现形式:1.英文 b'alex' 2.中文 b'\xe4\xb8\xad'
3、编码解码
字符串在传输时转换成bytes =>encode(字符集)来完成
1 s = 'alex' 2 print(s.encode('utf-8')) # 将字符串编码成UTF-8 3 print(s.encode('GBK')) #将字符串编码成GBK 4 结果: 5 b'alex' 6 b'alex' 7 8 s = '中' 9 print(s.encode('utf-8')) # 将字符串编码成UTF-810 print(s.encode('GBK')) #将字符串编码成GBK11 结果:12 b'\xe4\xb8\xad'13 b'\xd6\xd0'
注意:英文编码之后的结果和源字符串一致,中文编码之后的结果根据编码的不同,编码结果也不同,我们能看到,一个中文的UTF-8是3字节,一个GBK的中文编码是2字节。编码之后的数据类型是bytes,在网络传输和存储的时候我们python是保存和存储的bytes类型,那么在对方接收的时候,也是接收的是bytes类型的数据,我们可以使用decode()来进行解码操作,把bytes类型的数据还原回字符串
1 s = "我叫李嘉诚"2 print(s.encode("utf-8")) #3 b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'4 print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decode("utf-8")) # 解码
编码和解码的时候都需要指定编码格式
1 s = "我是文字"2 bs = s.encode("GBK") # 我们这样可以获取到GBK的文字3 # 把GBK转换成UTF-84 # 首先要把GBK转换成unicode. 也就是需要解码5 s = bs.decode("GBK") # 解码6 # 然后需要进行重新编码成UTF-87 bss = s.encode("UTF-8") # 重新编码8 print(bss)