Python中list意外转换为bytes类型的代码问题问询
问题解析与解决方案
1. 循环后变量类型改变的原因
Python里for循环的迭代变量会直接覆盖同名的外部变量。你的代码中:
bit = [列表推导式] # 此时bit是list类型 for bit in bit: # 迭代过程中,bit会被依次赋值为列表里的每个bytes元素 bit0 += bit
循环结束后,bit会保留最后一次迭代的取值(也就是列表里最后一个bytes元素),所以类型从list变成了bytes。这是Python变量作用域的正常表现,避免的方法很简单——给迭代变量换个名字,比如:
for b in bit: bit0 += b
2. 结果不符合预期的原因
你预期得到b'\x00',但实际生成的是b'\x00\x00',问题出在这行代码的切片逻辑:
int(0).to_bytes(length=input.sample_width, byteorder='big', signed=True)[1::-1]
假设input.sample_width的值是2,0.to_bytes(2, 'big', signed=True)会生成b'\x00\x00'。而切片[1::-1]的含义是从索引1的位置开始,以步长-1向前取到序列开头,对长度为2的bytes来说,会取到索引1和0的两个字节,结果还是b'\x00\x00'。
如果目标是获取单个字节的b'\x00',可以根据需求调整:
- 先检查
input.sample_width的取值是否正确,如果它本该是1,直接修正这个参数即可; - 若确实需要从2字节的bytes中提取单个字节,修改切片为
[0](取第一个字节)或[1](取第二个字节),或者用[:1]得到单字节的bytes:int(0).to_bytes(length=input.sample_width, byteorder='big', signed=True)[:1]
另外,你的列表推导式[z*input.channels for z in range(input.channels)],当input.channels=1时会生成[0],循环一次;如果input.channels>1,会生成多个0元素,导致bit列表有多个重复的bytes元素,最终bit0会拼接多次,结果更长。如果这不是你想要的,也需要调整这部分逻辑。
最后,如果你想把整个bit列表的bytes拼接成一个bytes对象,除了用bytearray累加,还可以直接用b''.join(bit),更简洁高效:
bit0 = b''.join(bit)
内容的提问来源于stack exchange,提问作者pingburner
相关产品推荐
相关产品推荐

