python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值;后者的实例包含Unicode字符。

python2中也有两种表示字符序列的类型,分别叫做str和unicode。与python3不同的是,str的实例包含原始的8位值而unicode的实例,则包含Unicode字符

上面两句话我特别不懂,所以文章后面就下是希望为了把上面两句话弄懂。

看几个例子:

#在python2中
>>> type('x'.decode('utf-8'))
<type 'unicode'> #为啥不是二进制了,字符串还能解码?再怎么解 #在python3中
>>> type('x'.decode('utf-8')) #这才是正常的吗!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode' #字符串怎么解,本来就没有吗

首先这个就是Python语言本身的问题,因为在Python2的语法中,默认的str并不是真正意义上我们理解的字符串,而是一个byte数组,或者可以理解成一个纯ascii码字符组成的字符串,与python3中的bytes类型的变量对应,而真正意义上通用的字符串则是unicode类型的变量,它与Python3中的str变量对应本来应该用作byte数组的类型却用来做字符串,你说乱不乱,之所以这样做是为了与之前的程序保持兼容。

在Python2中,作为两种类型的字符序列,str与unicode需要转换,它们是这样转换的.

str——decode方法——》unicode——encode方法——》str

在python3中可以这样对应这转换,配合上面的图,也许会好理解一点。

byte——decode(解码)方法——》str——>encode(编码)方法——》byte

#在python2中
>>> type('x')
<type 'str'> >>> type('x'.decode('utf-8'))
<type 'unicode'> >>> type(u'x'.encode('utf-8'))
<type 'str'> #在python3中
>>> type(x)
<class 'str'> >>> type(b'x')
<class 'bytes'>>>> type(b'x'.decode('utf-8'))
<class 'str'>

>>> type('x'.encode('utf-8'))
  <class 'bytes'>

还有就是隐式的转换,当一个unicode字符串和一个str字符串进行连接的时候,会自动将str字符串转换成unicode类型然后再连接,而这个时候使用的编码方式则是系统所默认的编码方式。python2默认的是ASCII,python3默认的是utf-8。

#在python2中
>>> x = u'喵'
>>> x
u'\u55b5'
>>> type(x)
<type 'unicode'> #在python3中
>>> x = u'喵'
>>> x
'喵'
>>> type(x)
<class 'str'> #为啥结果不一样

关于python2中的unicode和str以及python3中的str和bytes的更多相关文章

  1. Python “No module named” 以及在Python2中可以导入,但在python3中却出现的原因

    Python “No module named” 以及在Python2中可以导入,但在python3中却出现的原因 原因之1: 例如有这样的一个包和它的模块: Test __init__.py Mod ...

  2. 详解:Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests

    在python2中,urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.urllib2可以接受一个Request类的实例来设置URL请求的hea ...

  3. Python2中的urllib、urllib2和 Python3中的urllib、requests

    目录 Python2.x中 urllib和urllib2 常用方法和类 Python3.x中 urllib requests Python2.x中 urllib和urllib2 urllib 和 ur ...

  4. [Python3 填坑] 012 字典的遍历在 Python2 与 Python3 中区别

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python2 中字典的遍历 2.2 Python3 中字典的遍历 2.3 结论 1. print( 坑的信息 ) 挖坑时间:2019/ ...

  5. python中一些有用的函数------持续更新中

    strip() 函数 用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. str2 = " Runoob " # 去除首尾空格 print (str2.strip()) ...

  6. Python3中的运算符

    一.Python3中的运算符 强调这是Python3中的运算符 +    加法 -     减法 *     乘法 /     除法 //    整除,只要整数部分 **   幂运算 %   取余数 ...

  7. Python3中变量作用域nonlocal的总结

    最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下:   但是,为了更加方便地在闭包函数 ...

  8. python2和python3中str,bytes区别

    python2中,有basestring.str.bytes.unicode四种类型 其中str == bytes ,basestring = (str,unicode) >>> i ...

  9. python2中的unicode()函数在python3中会报错:

    python2中的unicode()函数在python3中会报错:NameError: name 'unicode' is not defined There is no such name in P ...

随机推荐

  1. python的偏函数(partial)

    偏函数就是固定原函数的某个参数,比如newadd就是固定了add方法的第一个参数,让a=3,这样对newadd方法只要传入参数B就可以实现add方法了,刚看偏函数的写法可能会不适应,因为partial ...

  2. nonlocal(非局部变量)---python 3.x 新增关健词

    Python里只有2种作用域:全局作用域和局部作用域.全局作用域是指当前代码所在模块的作用域,局部作用域是指当前函数或方法所在的作用域.其实准确来说,Python 3.x引入了nonlocal关键字, ...

  3. 【VBA】显示Excle内置对话框

    点击上图中的"显示Excle内置对话框",显示效果如下: 源代码: Public Sub 显示Excel内置对话框() UserForm.Show End Sub 附件下载

  4. Struts2学习小结

    1 基础 使用:导入 jar 包,配置 web.xml,并引入 struts.xml 文件 DMI:动态方法调用,调用时使用!分隔 action 名与方法名,如 index ! add.action, ...

  5. java清除所有微博短链接 Java问题通用解决代码

    java实现微博短链接清除,利用正则,目前只支持微博短链接格式为"http://域名/字母或数字8位以内"的链接格式,现在基本通用 如果链接有多个,返回结果中会有多出的空格,请注意 ...

  6. MongoDB基本命令使用

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示 ...

  7. nginx 做前端代理时proxy参数配置

    1.后台可登录: proxy_connect_timeout 300s; proxy_send_timeout ; proxy_read_timeout ; proxy_buffer_size 256 ...

  8. curl命令测试https

    curl -vosa --resolve pic.test.net::222.241.7.179 https://pic.test.net/UploadFiles/201312031744347965 ...

  9. 解决Incorrect integer value: &#39;&#39; for column &#39;id&#39; at row 1的方法

    在使用Navicat for MySQL还原数据库备份时.出现Incorrect integer value: '' for column 'id' at row 1的错误; 网上查资料发现5以上的版 ...

  10. 开发中可能会用到的几个小tip----QT, pycharm, android, 等

    QT: 如果是在windows下开发的话,添加外部库,外部包含头文件路径的时候,要注意用相对路径,或者在项目上右键添加外部库的路径或者头文件路径,否则,会卡在这里开始怀疑人生... 如果是在linux ...