为了账号安全,请及时绑定邮箱和手机立即绑定

既然已经引入了 unicode_literals模块,为什么str面前 不加b呢?

使用from __future__ import unicode_literals将把Python 3.x的unicode规则带入Python 2.7中。

参考代码:

from __future__ import unicode_literals
s = 'am I an unicode?'
print isinstance(s, unicode


正在回答

3 回答

你说的问题有两个方面,我觉得是你没弄明白u和b的区别。

一、Python 2有两种字符串类型:Unicode字符串和非Unicode字符串,Python 3只有一种类型:Unicode字符串(Unicode strings)。python2中字符串是以beytes方式存储的,pyton3中字符串是以unicode方式存储的。

引用python的模块后,s = 'am I an unicode?' 默认就是Unicode方式存储的,这对应了Python2 的s = u'am I an unicode?'

例如在python2.7中:

>>> s = 'am I an unicode?'

>>> print isinstance(s, unicode)

>>> False

>>> s = u'am I an unicode?'

>>> print isinstance(s, unicode)

>>> True

二、b是将字符串存储为字节码:

python 2.7中:

>>> s = b'am I an bytes?'

>>> s = 'am I an bytes?'

>>> isinstance(s,str)

>>> True

>>> isinstance(s,bytes)

>>> True

如上,在Python2.7中字符串是以bytes方式存储的。

python3中:

>>> s = 'am I an bytes?'

>>> type(s)

<class 'str'>

>>> isinstance(s,unicode)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'unicode' is not defined

>>>

>>> s = b'am I an bytes?'

>>> type(s)

<class 'bytes'>

>>> isinstance(s,str)

False

可以看到在python isinstance(s,unicode)报错了,isinstance中没有了unicode的判断,在python3中str是以unicode方式存储的。


8 回复 有任何疑惑可以回复我~
#1

MISS_time 提问者

非常感谢!
2018-02-07 回复 有任何疑惑可以回复我~

我理解引入模块后再加b, 相当于没引入,又回到了Python 2.x 的默认的以str存储

0 回复 有任何疑惑可以回复我~

我理解引入模块后再加b, 相当于没引入,又回到了Python 2.x 的默认的以str存储

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

既然已经引入了 unicode_literals模块,为什么str面前 不加b呢?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信