尝试连接字节和整数列表时遇到错误。我设法解决了这个问题,但是我想知道是否有人知道是什么导致了奇怪的行为。
这有效,并打印出[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
为什么会发生这种情况,我应该注意什么类似的行为?
答案 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 + b
和a += 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而不是列表。