编码与小数据池
# 字符编码计算机底层储存的都是二进制码 # 而我们将这些二进制码进行规律排列就诞生了字符编码 # 最初的编码是ACCII编码,他是采用了八位二进制码,主要包含了英文数字和一些特殊字符 # 八位二进制码最多只能包含256种变化 # 中国所使用的是GBK国标编码采用16位二进制码,而我们将八位二进制码称为一个字节 # 为了统一标准后续推出了万国码unicode编码 # unicode编码可以表示上亿字符,对于内存硬盘是一种很大的浪费,所以就有了现在的UTF-8,UTF-16压缩的unicode编码 # UTF-8中如果是英文数字,则使用ACCII编码,占用一个字节,如果是汉字则是三个字节 # 00000000 00000000 00000000 10101010 假设这个表示内存中的10,那么前三个字节就属于浪费空间,而在UTF-8编码中就去除了这些填补的字节 # 提及编码我们就涉及到内存的问题,在python3中默认使用的是unicode编码 # 在python中有两个优化机制,一个是代码块的缓存机制,一个是小数据池机制 # 前提条件:在同一个代码块内。 # 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。 # 换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录, # 如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象, # 满足缓存机制则他们在内存中只存在一个,即:id相同。 # 适用对象: int(float),str,bool。 # 对象的具体细则:(了解) # int(float):任何数字在同一代码块下都会复用。 # bool:True和False在字典中会以1,0方式存在,并且复用。 # str:几乎所有的字符串都会符合缓存机制,具体规定如下 s1 = '天空!@#wer&*' s2 = '天空!@#wer&*' print(s1 is s2) # 打印为True,前提是在同一个代码块下,如果非同一代码块则为False # 小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等,博主认为,只要你在网上查到的这些名字其实说的都是一个意思,叫什么因人而异。 # 那么到底什么是小数据池?他有什么作用呢? # 前提条件:在不同一个代码块内。 # Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。 # python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。 # 其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序 # 中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。 # 适用对象: int(float),str,bool # int:那么大家都知道对于整数来说,小数据池的范围是-5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。 # 字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。 # 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。 # 用乘法得到的字符串,分两种情况。 # 仅含大小写字母,数字,下划线,默认驻留,且乘数为一,默认驻留 # 仅含大小写字母,数字,下划线,总长度<=20,默认驻留 # 指定驻留。 from sys import intern a = intern('hello!@'*20) b = intern('hello!@'*20) print(a is b)