bytearray对象类型

bytearray对象是与bytes对象相对应的可变对象。bytearray对象通过bytearray构造函数建立。bytearray对象是0~255的一个可变序列。bytearray函数生成bytearray对象。

bytearray([source[, encoding[, errors]]])
source参数,可选,可以用几种不同的方式来初始化数组:
・如果它是一个字符串,那么您还必须给出编码(以及可选的错误)参数,将字符串转化成字节序列。
・如果它是一个整数,那么数组将具有这个大小,并将用零初始化。
・如果它是符合缓冲区接口的对象,则将使用对象的只读缓冲区来初始化字节数组。
・如果它是可迭代的,那么它必须是range 0<=x<256的整数的迭代,它被用作数组的初始内容。 ・如果没有参数,则创建一个大小为0的数组。
encoding参数,可选,指定编码。
errors参数,可选。

当source参数是一个字符串时

1
2
3
b = bytearray('你好', encoding='utf-8')
print(b)        # 输出bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
print(type(b))  # 输出<class 'bytearray'>

当source参数是一个整数时

1
2
3
b = bytearray(5)
print(b)        # 输出bytearray(b'\x00\x00\x00\x00\x00')
print(type(b))  # 输出<class 'bytearray'>

当source参数是一个可迭代对象,那么这个迭代对象的元素都必须符合0<=x<256

1
2
3
b = bytearray([1, 2, 3, 4, 255])
print(b)        # 输出bytearray(b'\x01\x02\x03\x04\xff')
print(type(b))  # 输出<class 'bytearray'>

无参数时

1
2
3
b = bytearray()
print(b)        # 输出bytearray(b'')
print(type(b))  # 输出<class 'bytearray'>

bytearray是bytes的可变版本,bytes的大部分操作,bytearray都支持。

索引操作

通过索引获取的bytearray将是一个0到256之间的整数。
格式如下,i是索引值。i是正数,从左向右计算,第一个是0,第二个是1,依次类推。i是负数,从右向左计算,第一个是-1,第二个是-2,依次类推。
aa

例如:

1
2
3
4
5
6
7
8
a = bytearray("abc",encoding='utf-8')
b = bytearray("你好",encoding='utf-8')
print(a)
print(b)

print(a[0])  # a[0]是"a"
print(b[0])  # b[0]是"\xe4"
print(b[-1]) # i是负数,从右向左计算。-1表示第一个。

执行以上程序会输出如下结果:

1
2
3
4
5
bytearray(b'abc')
bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
97
228
189

注意: 因为bytearray对象是整数序列(类似于元组),对于bytearray对象b,b[0]将是整数,而b[0:1]将是长度为1的bytearray对象。(这与字符串不同,在字符串中,索引和切片都将生成长度为1的字符串对象)

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
s = "abc"
b = bytearray("abc",encoding='utf-8')

s1 = s[0]
s2 = s[0:1]
b1 = b[0]
b2 = b[0:1]
print(type(s1))
print(s1)
print(type(s2))
print(s2)
print(type(b1))
print(b1)
print(type(b2))
print(b2)

s3 = s[1]
s4 = s[1:2]
b3 = b[1]
b4 = b[1:2]
print(type(s3))
print(s3)
print(type(s4))
print(s4)
print(type(b3))
print(b3)
print(type(b4))
print(b4)

执行以上程序会输出如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<class 'str'>
a
<class 'str'>
a
<class 'int'>
97
<class 'bytearray'>
bytearray(b'a')
<class 'str'>
b
<class 'str'>
b
<class 'int'>
98
<class 'bytearray'>
bytearray(b'b')

切片操作

bytearray对象支持切片操作,语法格式如下:
bytearray对象[start:end]

start,end都是整数。索引值以 0 为开始值,如果是负数,则从尾部开始。-1为最末尾。
省略start,从0开始。
省略end,则获取剩余所有。
同时省略start和end,则复制当前的字节对象。

bytearray对象[start:end]获取索引值start开始,end结束(不包括end)的范围值。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
a = bytearray("Hello World",encoding='utf-8')
a1 = a[0:2]  #获取索引值从0到2(不包括2)的bytearray对象,结果是bytearray(b'He')
a2 = a[6:8]  #获取索引值从6到8(不包括8)的bytearray对象,结果是bytearray(b'Wo')
a3 = a[6:-1]  #获取索引值从6到-1(不包括-1)的bytearray对象,结果是bytearray(b'Worl')
a4 = a[:2]  #获取索引值从0到2(不包括2)的bytearray对象,结果是bytearray(b'He')
a5 = a[6:]  #获取索引值从6开始的所有bytearray对象,结果是bytearray(b'World')
a6 = a[:]   #复制当前的bytearray对象bytearray(b'Hello World')

print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
print(a6)

执行以上程序会输出如下结果:

1
2
3
4
5
6
bytearray(b'He')
bytearray(b'Wo')
bytearray(b'Worl')
bytearray(b'He')
bytearray(b'World')
bytearray(b'Hello World')

bytearray对象切片还有第三个参数step。表示步长。格式如下:
bytearray对象[start:end:step]

省略step参数时,默认是1,也就是获取索引从start开始,步长为1,到end结束的值。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
a = bytearray("Hello World",encoding='utf-8')
a1 = a[0:6:2]      #获取索引值从0到6(不包括6),步长为2的bytearray对象,结果是bytearray(b'Hlo')
a2 = a[2:6:2]      #获取索引值从2到6(不包括6),步长为2的bytearray对象,结果是bytearray(b'lo')
a3 = a[::3]        #步长为3的bytearray对象,结果是bytearray(b'HlWl')
a4 = a[0:-1:2]     #获取索引值从0到-1(不包括-1),步长为2的bytearray对象,结果是bytearray(b'HloWr')

print(a1)
print(a2)
print(a3)
print(a4)

执行以上程序会输出如下结果:

1
2
3
4
bytearray(b'Hlo')
bytearray(b'lo')
bytearray(b'HlWl')
bytearray(b'HloWr')

bytearray对象连接,复制

加号 + 是字节的连接符,将两边的bytearray对象连接起来。

实例,bytearray对象连接

1
2
3
4
5
6
7
8
a = bytearray("abc",encoding='utf-8')
b = bytearray("你好",encoding='utf-8')

print(a)
print(b)

c = a + b
print(c)

执行以上程序会输出如下结果:

1
2
3
bytearray(b'abc')
bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
bytearray(b'abc\xe4\xbd\xa0\xe5\xa5\xbd')

星号 * 表示复制当前字节,紧跟的数字为复制的次数。数字必须是正整数。

实例,bytearray对象复制

1
2
3
4
5
6
7
a = bytearray("abc",encoding='utf-8')
b = bytearray("你好",encoding='utf-8')
print(a)
print(b)

print(a * 2)
print(b * 2)

执行以上程序会输出如下结果:

1
2
3
4
bytearray(b'abc')
bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
bytearray(b'abcabc')
bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd')