本文承接上一篇文章:python深入学习(三):从py2到py3 。
网上有太多关于这个东西阐述或是解释,不过按照这种技术文章的尿性,大都是相互转,或者写的人自己都没有搞清楚就随便罗列一下几个例子,让看的人看得不明不白的。真正有价值的好多英文的描述其实又看得不如中文清楚明白,所以我在我的理解的基础上尽可能从理论上描述清楚。
引入
进入正题之前首先我们先借用一下《流程的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类型没有半毛钱关系