网上有太多关于这个东西阐述或是解释,不过按照这种技术文章的尿性,大都是相互转,或者写的人自己都没有搞清楚就随便罗列一下几个例子,让看的人看得不明不白的。真正有价值的好多英文的描述其实又看得不如中文清楚明白,所以我在我的理解的基础上尽可能从理论上描述清楚。
引入
进入正题之前首先我们先借用一下《流程的python》中的一句话:
人类使用的是文本,计算机使用的是字节序列
这里文本就是字符串,所以人类使用的是可读的文本字符串,计算机使用的是原始的字节序列,而这一点上python3严格的区分了人类可读的文本字符串和原始字符序列
那字符串是一个相当简单的概念,一个字符串就是一个字符序列,问题出在字符的定义上。根据python官方的理解,字符的最佳定义是unicode字符。所以python3的str对象中获取的元素就是unicode字符,这也相当于从python2的unicode对象之中获取的元素,而不是从python2的str对象中获取的原始字节序列。
可能稍微有些不理解,不过没关系,继续往下看,
在此之前,我还是想要再强调一下编码和解码的概念,即对应的.decode和.encode函数
编码和解码
如果我们把字节序列当做我们看不懂的但是方便计算机传输转存的东西(对应python3的bytes类型), 然后unicode字符当做”人类可读”的文本(对应python3的str类型)
那么 把字节序列变成人类可读的文本字符串就是解码
而 把人类可读的文本字符串变成字节序列就是编码
所以在python3中,把str类型变成bytes类型就是编码,把bytes类型变成str类型就是解码 ,也就是说python3中str类型就是人类可读的文本字符串,bytes类型就是人类”看不懂”的方便机器传输的字节序列。
#python3
>>> '123'.encode('utf-8')
b'123'
>>> b'123'.decode('utf-8')
'123'
这下相信基本都能理解这个文本字符串和字符序列的区别了,以及python3中的str和bytes到底是用来干嘛的了。
python2与python3
有了上面的基础,我们可以很好的理解接下来的内容,先看python2的栗子
#python2
>>> '123'.encode('utf-8')
'123'
>>> '123'.decode('utf-8')
u'123'
那这样对应之前可以知道
1、python3的str类型 <=> python2的unicode类型
2、python3的bytes类型 <=> python2的str类型
只不过从0x01和0x02两个栗子的细微比较可以看出来,在0x02的例子中,我们的str相当于同时被编码和被解码了,代表什么?
这代表着这个python2中的str类型即在用于计算机的传输转存又在用于给人类可读,那必然是矛盾的,而在python3中,str类型就是给人类可读的类型,而一切的传输转存都是bytes类型。 这就是python2和python3的字符串和字符序列上的一个重大的改变。
希望我上述的描述能帮大家理解这个东西,如果大家有疑问或是发现有错的请联系我相互交流。
PS : python2中也有bytes类型,但是它只是python2的str类型的别名,和python3的bytes类型没有半毛钱关系