1、小数据池
python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元。
代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块,eval()和exec()执行的时候也是代码块。
什么是命令行?
我们再控制台CMD中输入python进入的就是python的command模式。
一个command命令就是一个代码块
小数据池:一种数据缓存机制,也被称为驻留机制,也相当于常量池。(string iterning)
小数据池只正对:整数(int),字符串(str),布尔型(bool)(都是不可变的数据类型)
在py文件中,几乎所有的字符都会缓存。
id() 查看变量的内存地址
a = 123 print(id(a)) # 1416592208
在python中 对-5到256之间的整数会被驻留在内存中,讲一定规则的字符串缓存,在使用的时候,内存中只会创建一个该数据的对象,保存到小数池中,在使用的时候,直接从小数池中获取对象的内存引用,而不需要创建一个新的数据,这样会节省更多的内存区域。
优点:能够提高一些字符串,证书的处理速度,省略创建对象的过程。
缺点:在小数据池中创建或者插入新的内容,会花费较多的时间。
对于数字:-1~256是会被加到小数池中,每一次使用都是同一对象。
对于字符串:
1、如果字符串的长度是0 或者1,都会默认进行缓存。
2、字符长度大于1,但是字符串中只包含数字,字母,下划线时才会缓存
3、用到乘法的字符串,①乘数为1,仅包含数字,字母,下划线时才会被缓存。如果包含其他字符,而长度小于等于1 也会被驻存 ②乘数大于1,仅包含数字,字母,下划线时会被缓存,但字符串长度不能大于20.
4、指定驻留,我们可以通过sys模块总的intern()函数来指定要驻留的内容。
2、is 和 ==
== 判断左右两端的值是否相等,是不是一致,(比较内容)
is 判断左右两端的内存地址是否相等,如果返回 True,那可以确定这两个变量使用的是同一个对象。(比较内存地址)
当两个变量指向同一对象时,is 是 True ==也是True
如果在py 文件中写的字符串,几乎都是缓存的,在cmd中写的几乎都不会缓存。
a = 257 b = 257 print(id(a)) # 1707735307344 print(id(b)) # 1707735307344 print(a is b) # True
两个对象 内存地址是不一样的
lst1 = [1,2,3] # 两个对象 内存地址是不一样的 lst2 = [1,2,3] print(id(lst1)) # 2748225600840 print(id(lst2)) # 2748225627144
在创建字符串之前,会先去小数池比对,是否已经存在了该字符串,如果存在了,就不再创建新的了,直接拿原来存在的数据,省略掉反复重复创建字符串的过程,节约内存。
3、编码的补充
1、回顾编码
ASCII:最早的编码,里边有英文大写字母,英文小写字母,数字,一些特殊字符,没有中文, 8bit,一个byte
GBK:包含ASCII,中文(主要),日文,韩文,繁体文字。16bit ,2byte
unicode:万国码,包含ASCII,gbk,big5. ...32bit, 4byte
UTF-8:可变长度的unicode
1、英文: 8bit ,1 byte
2、欧洲文字:16bit , 2byte
3、中文: 24bit , 3byte
不同的编码间不能随意转化,需要通过媒介(unicode)转化。
在python3中,默认的编码是unicode,我们的字符串就是unicode
在python2 中,默认的编码是ASCII,Cpython,c语言的默认编码是ASCII
unicode的弊端:在存储和传数数据的时候不能直接使用unicode,必须要对字符串进行编码,编码成ASCII类型。
bytes:字节形式的字符串,不是给人看的,是给机器用的。非ASCII中的内容,展示的时候都是 \x..如果是ASCII中的内容,原样输出。
1、encode(编码格式) 编码
2、decode(编码格式) 解码
UTF-8 和GBK是不能直接转化的,必须使用unicode来转化。
m = '今天晚上想看什么书!' a = m.encode('gbk') print(a) b = m.encode('utf-8') print(b) # b'\xbd\xf1\xcc\xec\xcd\xed\xc9\xcf\xcf\xeb\xbf\xb4\xca\xb2\xc3\xb4\xca\xe9\xa3\xa1' # b'\xe4\xbb\x8a\xe5\xa4\xa9\xe6\x99\x9a\xe4\xb8\x8a\xe6\x83\xb3\xe7\x9c\x8b\xe4\xbb\x80\xe4\xb9\x88\xe4\xb9\xa6\xef\xbc\x81'