一、bytearray函数简介

【描述】

bytearray() 方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。

【语法】

class bytearray([source[, encoding[, errors]]])

【参数】

  • 如果 source 为整数,则返回一个长度为 source 的初始化数组;
  • 如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
  • 如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;(刚好是28,一个字节就是8比特)
  • 如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
  • 如果没有输入任何参数,默认就是初始化数组为0个元素。

【返回值】

返回新字节数组,可变字节序列 bytearray 有一个明显的特征,输出的时候最前面会有一个字符 b 标识。

二、实例

a = bytearray()  # 定义空的字节序列bytearray
b = bytearray(3) # 定义指定个数的字节序列bytes,默认以0填充,不能是浮点数

c = bytearray("w01ke", "utf-8")

d = bytearray([1, 2, 3]) # 可迭代类型

print(a)
print(b)
print(c)
print(d)

try:
e = bytearray([1, 2, 256]) # 报错
print(e)
except ValueError as f:
print(f)

​ 输出

bytearray(b'')
bytearray(b'\x00\x00\x00')
bytearray(b'w01ke')
bytearray(b'\x01\x02\x03')
byte must be in range(0, 256)

​ 接下来来探究字节序列具体的每个字节的值是多少

b = bytearray(3)   # 定义指定个数的字节序列bytes,默认以0填充,不能是浮点数

c = bytearray("w01ke", "utf-8")

d = bytearray([1, 2, 3]) # 可迭代类型

print(b)
for i in range(len(b)):
print(b[i])
print(c)
for i in range(len(c)):
print(c[i])
print(d)
for i in range(len(d)):
print(d[i])

​ 结果如下所示,可以看到每个字节的值就是对应的ASCII码(十进制)

bytearray(b'\x00\x00\x00')
0
0
0
bytearray(b'w01ke')
119
48
49
107
101
bytearray(b'\x01\x02\x03')
1
2
3

三、与bytes函数的区别

其他都一样。不同的是bytes为不可变字节序列,可以看作是由一个个byte(二进制0-255数值)组成的str序列。bytearray为可变字节序列,可以看作是一组二进制数值的(0-255)的list序列。举例如下

a = b'w01ke'  # bytes类型,不可变字节序列
print(type(a))
for i in a:
print(i, end=" ")

a[0] = "A" # 会报错


'''
输出结果
<class 'bytes'>
119 48 49 107 101 Traceback (most recent call last):
File "C:\\Users\\86147\\Desktop\\demo.py", line 6, in <module>
a[0] = "A"
TypeError: 'bytes' object does not support item assignment
'''

​ 如果换成bytearray类型即可修改内容

a = b'w01ke'  # bytes类型,不可变字节序列
print(type(a))
a = bytearray(a)
print(type(a))
for i in a:
print(i, end=" ")

a[0] = 65

print("\n")
print(a)


'''
输出结果
D:\\Python3.7.9\\python.exe C:\\Users\\86147\\Desktop\\demo.py
<class 'bytes'>
<class 'bytearray'>
119 48 49 107 101

bytearray(b'A01ke')
'''