一、小数据池
1.id()
小数据池针对的是:int ,str,boo(都是不可变的数据类型)
(1)如果是在py文件中写的字符串,几乎都是缓存的
(2)在黑窗口里写的机会都不会缓存
(3)不同的解释器,缓存的机制也不一样
优点:
可以帮我们快速的创建对象,节省内存
缺点:
缓存如果过大,反应速度会比较慢
在py文件中几乎所有的字符串都会缓存,id()查看变量的内存地址
s = "alex" print(id(s))
2. is 和 ==
==判断左右两端的值是否相等,不不是一致。
is判断左右两端内容的内存地址是否一致,如果返回True,哪可以确定这两个变量使用的是同一个对象
lst1 = [1,2,3] lst2 = [1,2,3] # # 列表没有小数据池 print(id(lst1), id(lst2)) # 166167560 166126408 print(lst1 == lst2) # True print(lst1 is lst2) # False # s1 = "我叫周润发" s2 = "我叫周润发" print(s1 == s2) print(s1 is s2) # 小数据池 tu1 = ("周一", "周二") tu2 = ("周一", "周二") print(tu1 is tu2) # 地址不相等 False print(tu1 == tu2) # 内容相等 True # == 比较的是内容 # is 比较内存地址
二、编码的补充
1.python2中默认的使用的是ASCII码,所以不支持中文,如果需要在python2中更改编码需要在文件的开始编写:
# -*- encoding:utf-8 -*-
2.python3中:内存中使用的是Unicode码。
编码回顾:
1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂,
8个01代码, 8个bit, 1个byte
2. GBK: 中⽂国标码, ⾥⾯包含了ASCII编码和中⽂常⽤编码. 16个bit, 2个byte
3. UNICODE: 万国码, ⾥⾯包含了全世界所有国家⽂字的编码. 32个bit, 4个byte, 包含了
ASCII
4. UTF-8: 可变⻓度
bytes的表现形式:
1. 英⽂ b'alex' 英⽂的表现形式和字符串没什么两样
2. 中⽂ b'xe4xb8xad' 这是⼀个汉字的UTF-8的bytes表现形式
编码:
encode(utf-8/gbk):编码,把字符串转化成utf-8/gbk格式bytes
decode(utf-8/gbk):解码,把bytes解码成字符串
utf-8和gbk是不能直接转换的, 必须使用unicode来转换
s = "我今天非常的困" # 21个utf-8 bs = s.encode("gbk") # 把字符串转化成utf-8格式bytes # # bytes不是给人看的. 给机器用的 # # 14个字节 gbk b'xcexd2xbdxf1xccxecxb7xc7xb3xa3xb5xc4xc0xa7' # # 21个字节 utf-8 # # b'xe6x88x91xe4xbbx8axe5xa4xa9xe9x9dx9exe5xb8xb8xe7x9ax84xe5x9bxb0' print(bs)
把字节转化回字符串
bs = b'xe6x88x91xe4xbbx8axe5xa4xa9xe9x9dx9exe5xb8xb8xe7x9ax84xe5x9bxb0' s = bs.decode("utf-8") print(s)
关于bytes, 非ascii中的内容. 展示的时候都是x.. 如果是ascii中的内容. 原样输出
name = "alex昨天吃多了" bs = name.encode("gbk") # b'alexxd7xf2xccxecxb3xd4xb6xe0xc1xcb' print(bs) bss = name.encode("utf-8") # b'alexxe6x98xa8xe5xa4xa9xe5x90x83xe5xa4x9axe4xbax86' print(bss)