编码以及知识点补充
主要内容:
1,is和==的区别
2,编码的问题
一,is和==的区别
1,id( )
通过id( )我们可以查看到一个变量表示的值在内存中的地址
s = "alex" print(id(s)) # 2332857447176 s1 = "alex" print(id(s1)) # 2332857447176 lst = [1,2,3] print(id(lst)) # 1587609412552 lst1 = [1,2,3] print(id(lst1)) # 1587610244616
我们发现,字符串的数据地址是一样的,而,列表的数据地址是不一样的.
原因是:小数据池(常量池):把我们使用过的值存储在小数据池中,供其它的变量使用.
小数据池给数字和字符串使用,其他数据类型不存在.
对于数字:-5~256是会被叫到小数据池中的,每次使用都是同一个对象.
对于字符串:
1.如果是纯文字信息和下划线,那么这个对象会被添加到小数据池
2,如果是带有特殊字符的,那么不会被添加到小数据池,每次都是新的.
3,如果是单一的字母*n的情况,a*20,在20个单位内是可以的,超过20个单位就不会添加
到小数池中
注意:(一般情况下):在py文件中,如果你只是单纯的定义一个字符串,那么一般情况下都是会被添加到小数据池中的,我们可以这样认为,在使用字符串的时候,python会帮我们把字符串进行缓存,在下一次使用的时候直接指向这个字符串即可,可以节省很多内存
== 双等号表示的是判断是否相等,注意.这个双等号比较的具体的值,而不是内存地址
s1 = 'alex' s2 = 'alex' print(s1 == s2) # True print(s1 is s2) # True l1 = [1,2,3] l2 = [1,2,3] print(l1 == l2) # True print(l1 is l2) # False
总结:
is比较的是地址
== 比较的是值
二,编码的补充
python2中默认使用的是Ascii码,所以不支持中文,如果需要在python2中更改编码,需要在文件开始编写:
# -*- encoding:utf-8 -*-
python3中:内存中使用的是unicode码
补充:
在python3中的内存中,在程序运行阶段,使用的是unicode编码,因为unicode是万国码,是么内容都可以进行显示,那么数据传输和存储的时候由于Unicode比较浪费空间和资源,需要把unicode转存成utf-8或者gbk进行存储,编码之后的数据室bytes类型的数据,其实,还是原来的数据只是经过编码之后表现形式发成了改变而已.
bytes的表现形式:
1,英文 b'alex' 英文的表现形式和字符串没什么两样
2,中文 b'\xe4\xb8\xad' 这就是一个汉字的utf-8的bytes表现形式
s = 'alex'
print(s.encode('utf-8'))
print(s.encode('gbk')) # b'alex'
s = '中'
print(s.encode('utf-8')) # b'\xe4\xb8\xad'
print(s.encode('gbk')) # b'\xd6\xd0'
记住:英文编码之后的结果和源字符串一致,中文编码之后的结果根据编码的不同.编码结果也不同.我们能看到.一个中文的utf-8编码是3个字节,一个gbk的中文编码是2个字节.

浙公网安备 33010602011771号