bytes() 是 Python 内置的字节序列构造函数,用于创建不可变的字节对象(immutable sequence of bytes)。

字节对象常用于二进制数据处理、文件读写、网络传输、加密处理等场景。

与之对应的可变版本是。

一、函数语法

bytes(source=b'', encoding=None, errors='strict')

参数

source:可选。可以是:

整数:表示新建的字节序列长度,每个字节值为 0(即 0x00)。

可迭代对象:其中每个元素必须是 0 ~ 255 之间的整数。

字符串:必须同时提供 encoding 参数。

bytes / bytearray 对象:通常会创建其不可变副本(但对于 bytes,可能直接返回原对象引用)。

默认值为空字节序列 b''。

encoding:可选。当 source 是字符串时,指定编码方式(如 'utf-8'、'ascii')。默认为 None。

errors:可选。

当 source 是字符串时,指定编码错误的处理方式。

默认为 'strict',表示遇到非法字符时报错。

常用还有 'ignore'(忽略非法字符)、'replace'(替换为占位符)。

返回值

返回一个新的 bytes 对象(不可变)。

二、基础用法示例

1、创建空字节对象

b1 = bytes()
print(b1)        # b''
print(type(b1))  #

2、由整数创建(全 0 填充)

当 source 是一个整数 n 时,bytes(n) 会创建一个长度为 n 的字节序列,且每个字节的值都是 0(即二进制 00000000,十进制 0,十六进制 0x00)。

b2 = bytes(5)    # 长度为 5,每个字节值都是 0
print(b2)        # b'\x00\x00\x00\x00\x00'  → 十六进制表示
print(list(b2))  # [0, 0, 0, 0, 0]         → 十进制表示

提示:

这里的 0 并不是字符 '0'(ASCII 值 48),而是空字节,表示该位置没有存储任何有效数据。

3、由可迭代对象创建

b3 = bytes([65, 66, 67])  # 65,66,67 对应 ASCII 的 A,B,C
print(b3)                 # b'ABC'

4、由字符串创建(需指定编码)

b4 = bytes("你好", encoding='utf-8')
print(b4)  # b'\xe4\xbd\xa0\xe5\xa5\xb

5、从已有字节对象创建副本

当 source 已经是 bytes 对象,且未指定 encoding、errors 时,bytes() 会直接返回同一对象引用(而不是创建副本),因为 bytes 是不可变类型,这样可以节省内存、提高性能。

b4 = bytes("你好", encoding='utf-8')
b5 = bytes(b4)
print(b5 is b4)  # True(引用复用)

如果需要强制生成新对象,可以复制数据:

b5 = bytes(b4[:])  # 切片会生成新的 bytes 对象
print(b5 is b4)    # False

三、bytes 对象特点

1、不可变性

bytes 类似于元组,内容不可修改:

b = b'ABC'
# b[0] = 68  # ❌ TypeError: 'bytes' object does not support item assignment

如需可变字节序列,应使用 bytearray()。

2、序列特性

支持索引、切片、迭代、成员测试等操作:

b = b'Python'
print(b[0])     # 80(字节值,而不是字符)
print(b[:3])    # b'Pyt'
print(80 in b)  # True

3、与 str 的关系

str 是文本(Unicode),bytes 是二进制数据。两者需通过 .encode() 与 .decode() 转换:

s = "Hello"
b = s.encode('utf-8')   # str -> bytes
print(b)                # b'Hello'

s2 = b.decode('utf-8')  # bytes -> str
print(s2)               # Hello

四、进阶技巧

1、指定编码

b = bytes("Café", encoding='latin-1')
print(b)  # b'Caf\xe9'

2、错误处理

# 使用 ignore 忽略无法编码的字符
b = bytes("你好", encoding='ascii', errors='ignore')
print(b)  # b''

五、补充说明与注意事项

1、字符串必须指定编码

否则会报错:

bytes("abc")  # ❌ TypeError: string argument without an encoding

2、索引返回整数(字节值),不是单字节对象

b = b'A'
print(b[0])  # 65

3、不可变性导致需要重新创建对象

对 bytes 的“修改”会生成新对象,频繁修改应考虑 。

4、引用复用优化

当传入的对象已经是 bytes 类型,bytes() 会直接返回原对象引用,而不是复制数据。

点赞有美意,赞赏是鼓励