【发布时间】:2019-08-26 08:39:52
【问题描述】:
在python3中,我对字节文字的了解是
只要一个字节可以用可打印的ASCII字符表示,它就会显示为这个字符。例如
b'\x63\xf8'将是b'c\xf8'最近发现有一个奇怪的属性。似乎
\之后的数字(如果每个数字小于 8 并且所有数字的长度 八进制,例如b'\123' == b'S',但似乎最大的是b'\377' == b'\xff'。但是,b'\474' == b'<', b'\574' == b'|'
谁能解释第二个属性上面的奇怪行为? \ 后面的数字形式的字节的一般规则是什么?
【问题讨论】:
-
0o474 == 316和316 % 256 == 60和chr(60) == '<'。字节的值只能达到256,因此如果表示的数字大于 256,则仅保留前 8 位。恕我直言,这应该是一个错误(我希望出现无效的转义异常或其他东西)......也许检查值有效性的成本太大而不值得支付,因此这个实现 -
@00 实际上,描述中并没有提到 literals。它正在描述字节对象,并且正如您链接的问题所描述的那样,
bytes((0o407,))确实会引发ValueError所描述的问题。文档并没有说文字\407将触发ValueError(事实上,我希望在编译时得到一个SyntaxError无效文字......而不是在运行时ValueError)。 -
@GiacomoAlzetta 谢谢。单字节最高值不是 255 吗?
-
@Spaceship222 在这里(对于 Python),是的。参见例如docs.python.org/3/library/functions.html#func-bytes 。可以说,有有符号和无符号字节,但 Python 使用无符号字节。
-
@GiacomoAlzetta 谢谢,这对我来说很糟糕。该句子以“While byte literals [...]”开头,但在逗号之后继续以“, bytes objects 实际上 [...]”。我会在我的回答中注明。
标签: python python-3.x