一.is和==的区别
1.id()方法,可以查看一个变量的内存地址
1 lst = ["周杰伦", "燃哥"] 2 lst1 = ["周杰伦", "燃哥"] 3 print(id(lst)) 4 print(id(lst1)) 5 #输出结果:2016969304136 6 2016999144008 7 #可以看出地址不一致 8 9 s = "燃哥" 10 s1 = "燃哥" 11 # 小数据池. 会对字符串进行缓存, 为了节省内存 12 print(id(s)) 13 print(id(s1)) 14 #输出结果:2666201022288 15 2666201022288 16 #地址是一致的
总结:
1)python中是有一个小数据池的,如果你单纯的定义一个字符串,那么一般情况下都是会被添加到小数据池中
python会帮我们把字符串进行缓存,在下次使用的时候直接指向这个字符串即可,可以节省很多空间,
2)小数据池也可对数字进行缓存,但也是有范围的-5~256是会被加的,超出则不加;
3)对于字符串:a:是纯字母和下划线.那么这个对象会被添加到小数据池,中文也是特殊字符,字符串中带有中文是不会被添加的
b:带有特殊字符的. 那么不会被添加到小数据池. 每次都是新的;例如:s1='@alxt'和s2='@alxt'地址不一样
c:如果是单一字母*n的情况.'a'*20,在20个单位内是可以的.超过20个单位就不会添加到小数据池中
2.== 双等表示的是判断是否相等,注意,这个双等比较的是具体的值,而不是内存地址
3.总结:is比较的是内存地址
==比较的是值
二.编码的补充
1.在python2默认使用的是ASCII码,所以不支持中文,如果想要在python2中更改编码,需要在文件的开始编写:
1 -*- encoding:utf-8 -*
2.在python3中:内存中使用的是unicode码
3.1 ASCII:最早的编码,没有中文,8个二进制位,一个字节;
3.2 GBK:中文国标码,里面包含ASCII编码和中文常用编码,16个二进制位(bit),2个字节;
3.3 Unicode:万国码,包含了全世界所有国家的文字的编码,32个二进制位,4个字节;
3.4 UTF-8:可变长度的万国码,是unicode的一种实现,英文:8位,1字节; 欧洲文字:16位,2字节; 中国文字:24位,3字节;
bytes的表现形式:英文:b"alex" 英文的表现形式和字符串没什么两样; 中文:b'xe4xb8xad一个字的utf-8表现形式;
1 s = "alex" 2 bs = s.encode("GBK") 3 cs= s.encode("utf-8") 4 print(bs) 5 print(cs) 6 #输出结果:b'alex' 7 b'alex'
GBK => utf-8:
1 bs = b'xb6xf6xc1xcbxc3xb4' 2 # 先解码成unicode字符串 3 s = bs.decode("GBK") 4 print(s) 5 # 在把字符串编码成UTF-8 6 bss = s.encode("utf-8") 7 print(bss) 8 #输出结果:饿了么 9 b'xe9xa5xbfxe4xbax86xe4xb9x88'