不一致的行为串联字节以列出Python 3

时间:2019-09-16 14:54:34

标签: python python-3.x typeerror

尝试连接字节和整数列表时遇到错误。我设法解决了这个问题,但是我想知道是否有人知道是什么导致了奇怪的行为。

这有效,并打印出[1, 2, 3, 97, 98, 99]

test_bytes = b'abc'
test_list = [1, 2, 3]
test_list += test_bytes
print(test_list)

但是这并不会引发错误:

test_bytes = b'abc'
test_list = [1, 2, 3]
test_list = test_list + test_bytes     # This line Changed
print(test_list)
Traceback (most recent call last):
  File "C:/Users/Rowan/Example/test.py", line 3, in <module>
    test_list = test_list + test_bytes
TypeError: can only concatenate list (not "bytes") to list

为什么会发生这种情况,我应该注意什么类似的行为?

3 个答案:

答案 0 :(得分:4)

对于列表,+=大致对应于list.extend,后者采用任意可迭代作为参数,因此也可以与str一起使用:

lst = [1,2,3]
x = 'abc'
lst += x
print(lst)
# [1, 2, 3, 'a', 'b', 'c']
另一方面,如果

+中的一个是list,则在接受的操作数方面要严格一些。您必须将str强制转换为list

lst + list(x)
# [1, 2, 3, 'a', 'b', 'c']

通常,可变的内置类型将适用的更新运算符(+=, -=, &=,...)实现为现有对象的突变。对于这些a = a + ba += b 是相同的,因为前者会创建新对象。

答案 1 :(得分:0)

这也将起作用:

test_bytes = b'abc'
test_list = [1, 2, 3]
test_list.extend(test_bytes)

print(test_list)

原因被隐藏可以在两个可变序列上工作,而您在非工作代码中尝试过的是将带有字节的列表进行复制。因此它会抛出TypeError: can only concatenate list (not "bytes") to list

答案 2 :(得分:0)

列表上的+操作将2个列表连接在一起。

list1 = [1,2,3]
list2 = [4,5,6]

new_list = list1 + list2
  

新列表:[1,2,3,4,5,6]

您要做的是将.append()的项目添加到现有列表中,而不要创建新列表:

test_bytes = b'abc'
test_list = [1, 2, 3]
for byte in test_bytes:
    test_list.append(byte)
  

test_list:[1、2、3、97、98、99]

这很有趣,我从未遇到过这种情况。您已经发现python在使用+=运算符时会将 bytes 字符串视为字节的 list ,而在使用时将其视为单个字节字符串+运算符。

我猜想,像我自己一样,这种处理对于大多数python程序员来说都是陌生的,因此建议单独对待这些字节,如上所示,而不是对现有字节使用+=

但是,如果您打算进行 byte 操作,我建议您使用bytearray而不是列表。