Python:bytes、bytearray

本文详细介绍了Python3中的bytes和bytearray类型,包括它们的定义、操作及编码解码。bytes是不可变的字节序列,而bytearray则是可变的。两者都可与字符串进行编码和解码,并提供了类似的方法进行操作,如split、fromhex等。此外,bytearray还支持追加、插入、删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bytes、bytearray

Python3引入两个新类型

  • bytes:不可变字节序列
  • bytearray:字节数组、可变

 

字符串与bytes

字符串是字符组成的有序序列,字符可以使用编码来理解

bytes是字节组成的有序的不可变序列

bytearray是字节组成的有序的可变序列

 编码与解码

字符串按照不同的字符集编码encode返回字节序列bytes

encode(encoding='utf-8', errors='strict') -> bytes

 字节序列按照不同的字符集解码decode返回字符串

bytes.decode(encoding="utf-8", errors="strict") -> str

bytearray.decode(encoding="utf-8", errors="strict") -> str

 

bytes定义

bytes() 空bytes

a = bytes()
print(type(a))  #<class 'bytes'>

bytes(int) 指定字节的bytes,被0填充

a = bytes(4)
print(a)  #b'\x00\x00\x00\x00'

bytes(iterable_of_ints) -> bytes [0,255]的int组成的可迭代对象

a = bytes(range(3))
print(a)  #b'\x00\x01\x02'

bytes(string, encoding[, errors]) -> bytes 等价于string.encode()

print(bytes("abc","utf8"))  #b'abc'
print("abc".encode("utf8"))    #b'abc'

bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer 从一个字节序列或者buffer复制出 一个新的【相当于前copy】

a = "abc".encode("utf8")
b = bytes(a)
print(id(a) == id(b))  #True
 

bytes操作【注意:下述方法若需要使用int类型,值在[0, 255]

和str类型类似,都是不可变类型,所以方法很多都一样。只不过bytes的方法,输入是bytes,输出是 bytes

a.split()  #切割

a = bytes("abc","utf8")
print(a.split(b"b"))   #[b'a', b'c']

类方法 bytes.fromhex(string)

  • string必须是2个字符的16进制的形式,'6162 6a 6b',空格将被忽略
print(bytes.fromhex('6162 09 6a 6b00'))  #b'ab\tjk\x00'

返回16进制表示的字符串


print("abc".encode("utf8").hex())  #616263

索引


print("abc".encode("utf8")[1])  #98

 

bytearray定义

bytearray

bytearray() 空bytearray

a = bytearray()
print(type(a))  #<class 'bytearray'>

 bytearray(int) 指定字节的bytearray,被0填充

a = bytearray(5)
print(a)  #bytearray(b'\x00\x00\x00\x00\x00')

 bytearray(iterable_of_ints) -> bytearray [0,255]的int组成的可迭代对象

a = bytearray(range(3))
print(a)  #bytearray(b'\x00\x01\x02')

bytearray(string, encoding[, errors]) -> bytearray 近似string.encode(),不过返回可变对象

a = bytearray("abc","utf8")
print(a)  #bytearray(b'abc')

bytearray(bytes_or_buffer) 从一个字节序列或者buffer复制出一个新的可变的bytearray对象

a = bytearray("abc","utf8")
b = bytearray(a)
print(b)  #bytearray(b'abc')

 

bytearray操作【注意:下述方法若需要使用int类型,值在[0, 255]

和bytes类型的方法相同

print(bytearray(b'abcdef').replace(b'f',b'k'))  #bytearray(b'abcdek')
bytearray(b'abc').find(b'b')  #1

类方法 bytearray.fromhex(string)

  • string必须是2个字符的16进制的形式,'6162 6a 6b',空格将被忽略
print(bytearray.fromhex('6162 09 6a 6b00')) #bytearray(b'ab\tjk\x00')

hex()  #返回16进制表示的字符串

print(bytearray('abc'.encode()).hex()) #616263

索引

print(bytearray(b'abcdef')[2]) #99

append(int) 尾部追加一个元素

b = bytearray()
b.append(97) 
print(b)  #bytearray(b'a')

insert(index, int) 在指定索引位置插入元素

b = bytearray()
b.append(97)
b.insert(1,98)
print(b)  #bytearray(b'ab')

 extend(iterable_of_ints) 将一个可迭代的整数集合追加到 当前bytearray

b = bytearray()
b.append(97)
b.insert(1,98)
b.extend([65,66,67])
print(b)  #bytearray(b'ab')  #bytearray(b'abABC')

pop(index=-1) 从指定索引上移除元素,默认从尾部移除

b = bytearray()
b.append(97)
b.insert(1,98)
b.extend([65,66,67])
b.pop(-1)
print(b)  #bytearray(b'abAB')

remove(value) 找到第一个value移除,找不到抛 ValueError异常

b = bytearray()
b.append(97)
b.insert(1,98)
b.extend([65,66,67])
b.pop(-1)
b.remove(66)
print(b)  #bytearray(b'abA')    

clear() 清空bytearray

b = bytearray()
b.append(97)
b.insert(1,98)
b.extend([65,66,67])
b.pop(-1)
b.remove(66)
b.reverse()
b.clear()
print(b)  #bytearray(b'')

reverse() 翻转bytearray,就地修改

b = bytearray()
b.append(97)
b.insert(1,98)
b.extend([65,66,67])
b.pop(-1)
b.remove(66)
b.reverse()
print(b)  #bytearray(b'Aba')

 

 

<think>我们正在讨论Python中的bytesbytearray的区别及使用。首先,bytesbytearray都是Python中用于处理二进制数据的类型。它们都是字节序列,但有一个关键区别:bytes是不可变的(immutable),而bytearray是可变的(mutable)。1. bytes类型:-不可变序列,类似于元组(tuple)对于列表(list)的关系。-一旦创建,就不能修改其中的元素。-通常用于处理二进制数据,如文件I/O、网络通信等,其中数据不需要改变。2.bytearray类型:-可变序列,类似于列表(list)。-可以在原处修改,支持索引赋值、添加、删除等操作。-适用于需要修改二进制数据的场景。使用示例:创建bytes对象:b =b'hello'#注意:bytes字面量使用b前缀创建bytearray对象:ba= bytearray(b'hello')#可以通过bytes对象或可迭代对象创建尝试修改:b[0] =65#会引发TypeError,因为bytes不可变ba[0] =65#可以,将第一个字节改为ASCII65(即'A'),此时ba变为bytearray(b'Aello')另外,两者都支持类似字符串的方法,如切片、查找等,但bytearray还支持可变序列的方法,如append、extend、pop等。内存视图(memoryview):对于需要高效操作二进制数据而不产生拷贝的情况,可以使用memoryview。它支持缓冲区协议,可以用于bytesbytearray。总结:-当数据不需要修改时,使用bytes(更安全,因为不可变)。-当数据需要修改时,使用bytearray。引用参考:Python官方文档中关于二进制序列类型的说明[^1]。现在,根据要求生成相关问题。</think>### Pythonbytesbytearray的区别及使用 #### 核心区别 1. **不可变性 vs 可变性** - **`bytes`**:**不可变序列**(类似元组),创建后内容不可修改 ```python b = b'hello' b[0] = 65 # 报错: TypeError ``` - **`bytearray`**:**可变序列**(类似列表),支持原地修改 ```python ba = bytearray(b'hello') ba[0] = 65 # 合法 → bytearray(b'Aello') ``` 2. **内存特性** - `bytes` 对象内存更小(无额外分配开销) - `bytearray` 需要额外内存存储可变状态 3. **创建方式** ```python # bytes创建 b1 = b"Python" # 字面量 b2 = bytes([80, 121]) # 从整数序列 → b'Py' # bytearray创建 ba1 = bytearray(b"data") # 从bytes对象 ba2 = bytearray(10) # 创建10个零字节 ``` #### 典型使用场景 | 类型 | 适用场景 | 示例 | |-------------|---------------------------------|-------------------------------| | **bytes** | 网络传输数据 | `socket.send(b"GET / HTTP/1.1")` | | | 文件读写(二进制模式) | `open("img.jpg", "rb").read()` | | | 哈希计算/加密 | `hashlib.sha256(b"data").digest()` | | **bytearray** | 需要修改的二进制缓冲区 | ```python ba = bytearray(b"123") ba[0] = 49 # 修改第一个字节 ``` | | | 协议解析(动态更新数据包) | 解析TCP数据包时逐字节修改 | | | 图像处理(像素级操作) | 修改PNG文件的像素数据 | #### 操作对比 | 操作 | bytes | bytearray | |---------------|---------------------------|----------------------------| | 索引访问 | `b[0]` → 返回整数 | `ba[0]` → 返回整数 | | 切片 | 返回新bytes对象 | 返回新bytearray对象 | | 修改元素 | ❌ 不支持 | ✅ `ba[1]=255` | | 追加数据 | ❌ 需用`b1 + b2` | ✅ `ba.append(97)` | | 内存视图 | `memoryview(b)` | `memoryview(ba)` | | 哈希值 | ✅ 可哈希(可用作字典键) | ❌ 不可哈希 | #### 转换关系 ```mermaid graph LR A[整数列表] -->|bytes| B(bytes对象) A -->|bytearray| C(bytearray对象) B -->|bytearray| C C -->|bytes| B B -->|list| D([72, 101, 108]) C -->|list| D ``` #### 最佳实践 1. **优先选择`bytes`**: 当数据不需要修改时(如配置读取、加密密钥),使用`bytes`更安全高效 ```python API_KEY = b"a1b2c3d4" # 不可变更安全 ``` 2. **使用`bytearray`的场景**: ```python # 构建动态二进制协议 header = bytearray([0xAA, 0xBB, len(data)]) header.extend(payload) # 动态扩展 # 实时数据处理 while sensor_data := read_sensor(): buffer = bytearray(sensor_data) process(buffer) # 原地处理 ``` 3. **高效转换技巧**: ```python # bytes → 修改 → 新bytes (避免多次复制) data = b"original" mv = memoryview(data) modified = bytes(mv[0:2] + b"XY" + mv[4:]) ``` > 关键参考:Python官方文档对二进制序列类型的说明[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值