【python基础系列2】bytes和bytearray的区别

此博客转载原文,对Python里的bytes和bytearray有详细说明,记录下来以便查看。

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

本文转载自原文链接。有详细说明,记录以下,方便查看。侵删!

<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、付费专栏及课程。

余额充值