在python中 对-5到256之间的整数会被驻留在内存中,讲必定规则的字符串缓存,在使用的时候,内存中只会建立一个该数据的对象,保存到小数池中,在使用的时候,直接从小数池中获取对象的内存引用,而不须要建立一个新的数据,这样会节省更多的内存区域。
优势:可以提升一些字符串,证书的处理速度,省略建立对象的过程。
缺点:在小数据池中建立或者插入新的内容,会花费较多的时间。
对于数字:-1~256是会被加到小数池中,每一次使用都是同一对象。
对于字符串:
一、若是字符串的长度是0 或者1,都会默认进行缓存。
二、字符长度大于1,可是字符串中只包含数字,字母,下划线时才会缓存
三、用到乘法的字符串,①乘数为1,仅包含数字,字母,下划线时才会被缓存。若是包含其余字符,而长度小于等于1 也会被驻存 ②乘数大于1,仅包含数字,字母,下划线时会被缓存,但字符串长度不能大于20.
四、指定驻留,咱们能够经过sys模块总的intern()函数来指定要驻留的内容。
二、is 和 ==
== 判断左右两端的值是否相等,是否是一致,(比较内容)
is 判断左右两端的内存地址是否相等,若是返回 True,那能够肯定这两个变量使用的是同一个对象。(比较内存地址)
当两个变量指向同一对象时,is 是 True ==也是True
若是在py 文件中写的字符串,几乎都是缓存的,在cmd中写的几乎都不会缓存。 python
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
在建立字符串以前,会先去小数池比对,是否已经存在了该字符串,若是存在了,就再也不建立新的了,直接拿原来存在的数据,省略掉反复重复建立字符串的过程,节约内存。
三、编码的补充
一、回顾编码
ASCII:最先的编码,里边有英文大写字母,英文小写字母,数字,一些特殊字符,没有中文, 8bit,一个byte
GBK:包含ASCII,中文(主要),日文,韩文,繁体文字。16bit ,2byte
unicode:万国码,包含ASCII,gbk,big5. ...32bit, 4byte
UTF-8:可变长度的unicode
一、英文: 8bit ,1 byte
二、欧洲文字:16bit , 2byte
三、中文: 24bit , 3byte
不一样的编码间不能随意转化,须要经过媒介(unicode)转化。
在python3中,默认的编码是unicode,咱们的字符串就是unicode
在python2 中,默认的编码是ASCII,Cpython,c语言的默认编码是ASCII
unicode的弊端:在存储和传数数据的时候不能直接使用unicode,必需要对字符串进行编码,编码成ASCII类型。
bytes:字节形式的字符串,不是给人看的,是给机器用的。非ASCII中的内容,展现的时候都是 \x..若是是ASCII中的内容,原样输出。
一、encode(编码格式) 编码
二、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'