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\xb5、从已有字节对象创建副本
当 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) # True3、与 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 encoding2、索引返回整数(字节值),不是单字节对象
b = b'A'
print(b[0]) # 653、不可变性导致需要重新创建对象
对 bytes 的“修改”会生成新对象,频繁修改应考虑 。
4、引用复用优化
当传入的对象已经是 bytes 类型,bytes() 会直接返回原对象引用,而不是复制数据。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.