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

在字符串文字前面,‘b’字符是做什么的?

在字符串文字前面,‘b’字符是做什么的?

蝴蝶不菲 2019-05-31 17:14:20
在字符串文字前面,‘b’字符是做什么的?显然,以下是有效的语法my_string = b'The string'我想知道:这是什么b字串前面的意思是?使用它有什么效果?使用它的适当情况是什么?我找到了一个相关问题就在这里,但是这个问题是关于PHP的,它指出b用于指示字符串是二进制的,而Unicode是从PHP<6版本兼容的代码在迁移到PHP 6时所需的。我认为这不适用于Python。我确实找到了本文件在Python站点上使用u在相同的语法中指定字符串为Unicode的字符。不幸的是,它没有提到b文件中任何地方的字符。而且,出于好奇,是否有更多的符号比b和u做其他的事?
查看完整描述

4 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

Python 3.x明确区分以下类型:

  • str = '...'

    文本=Unicode字符序列(UTF-16或UTF-32,取决于Python是如何编译的)
  • bytes = b'...'

    文本=八元序列(0到255之间的整数)

如果您熟悉Java或C#,请考虑strStringbytesbyte[]..如果您熟悉SQL,请考虑strNVARCHARbytesBINARYBLOB..如果您熟悉Windows注册表,请考虑strREG_SZbytesREG_BINARY..如果你熟悉C(+),那么忘记你学到的一切char和字符串,因为字符不是字节..这个想法早就过时了。

你用str当你想代表文本的时候。

print('שלום עולם')

你用bytes当您想表示像structs这样的低级二进制数据时。

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

你可以的编码 a str转到bytes对象。

>>> '\uFEFF'.encode('UTF-8')b'\xef\xbb\xbf'

你可以解码bytes变成str.

>>> b'\xE2\x82\xAC'.decode('UTF-8')'€'

但你不能随意混合这两种类型。

>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'Traceback (most recent call last):
  File "<stdin>", line 1, in <module>TypeError: can't concat bytes to str

二.b'...'符号有点混乱,因为它允许用ASCII字符而不是十六进制数字来指定字节0x01-0x7F。

>>> b'A' == b'\x41'True

但我必须强调,字符不是字节.

>>> 'A' == b'A'False

在Python2.x中

Python的前3.0版本缺乏文本和二进制数据之间的这种区别。相反,有:

  • unicode = u'...'

    文字=Unicode字符序列=3.x

    str

  • str = '...'

    文字=混乱的字节/字符序列
    • 通常是文本,以某种未指定的编码方式编码。
    • 但也用来表示二进制数据,如

      struct.pack

      输出。

为了简化2.x到-3.x的转换,b'...'将文字语法移植到Python2.6,以便区分二进制字符串(应该是bytes在3.x中)从文本字符串(应该是str(见3.x)。这个b前缀在2.x中什么也不做,但是告诉2to3脚本不将其转换为3.x中的Unicode字符串。

所以是的,b'...'Python中的文字具有与PHP中相同的目的。

而且,出于好奇,还有比b和u更多的符号做其他事情吗?

二.r前缀创建原始字符串(例如,r'\t'是反斜杠+t(而不是制表符),以及三重引号'''...'''"""..."""允许多行字符串文字.





    查看完整回答
    反对 回复 2019-05-31
    ?
    达令说

    TA贡献1821条经验 获得超6个赞

    b表示字节字符串。

    字节是实际数据。字符串是一种抽象。

    如果您有多个字符串对象,并且您接受了一个字符,那么它将是一个字符串,并且根据编码的不同,它的大小可能超过1字节。

    如果使用一个字节字符串的1字节,则从0-255中得到一个8位值,如果编码导致的字符大于1字节,它可能不代表完整的字符。

    tbh我会使用字符串,除非我有一些特定的低级原因来使用字节。


    查看完整回答
    反对 回复 2019-05-31
    ?
    潇湘沐

    TA贡献1816条经验 获得超6个赞

    它把它变成了bytes文字(或str在2.x)中,并且对2.6+有效。

    二.r前缀会导致反斜杠“未解释”(不忽略)和差异。是吗?)。


    查看完整回答
    反对 回复 2019-05-31
    • 4 回答
    • 0 关注
    • 3884 浏览
    慕课专栏
    更多

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信