在 Python (2.7) 中发现了以前从未提及的有趣的东西。
这:
a = []
a += "a"
确实有效,结果是:
>>> a
>>> ["a"]
但
a = []
a = a + "a"
给
>>> TypeError: can only concatenate list (not "str") to list
有人可以解释为什么吗?感谢您的回答。
Python 区分了+
and+=
运算符,并为它们提供了单独的钩子;__add__
和__iadd__
。该list()
类型只是为后者提供了不同的实现。
列表单独实现这些更有效;__add__
必须返回一个全新的列表,而__iadd__
可以扩展self
然后返回self
。
在 C 代码中,__iadd__
由 实现list_inplace_concat()
,它简单地调用listextend()
,或者,在 python 代码中,[].extend()
. 后者按设计采用任何顺序。
__add__
另一方面,在 C 中由 表示的方法list_concat
仅将 alist
作为输入,可能是为了提高效率;它可以直接在内部 C 数组上循环并将项目复制到新列表中。
总之,__iadd__
接受任何序列的原因是因为在实施PEP 203(增强添加提案)时,对于列表来说,重用该.extend()
方法是最简单的。
如果a
是列表,a + x
则仅在x
也是列表时才有效,而a += x
适用于任何可迭代的x
。
以下内容可能有助于理解它:
In [4]: a = []
In [5]: a += "abc"
In [6]: a
Out[6]: ['a', 'b', 'c']
关键是"a"
和"abc"
是可迭代的,这使得它们能够在+=
.
这不起作用,+
因为后者要求两个操作数的类型相同(请参阅手册)。
要使用 编写相同的内容+
,您必须扩展可迭代对象:
In [7]: a = []
In [8]: a = a + list("abc")
In [9]: a
Out[9]: ['a', 'b', 'c']
换句话说,+=
比+
应用于列表时更通用。