6

在 Python (2.7) 中发现了以前从未提及的有趣的东西。

这:

a = []
a += "a"

确实有效,结果是:

>>> a
>>> ["a"]

a = []
a = a + "a"

>>> TypeError: can only concatenate list (not "str") to list

有人可以解释为什么吗?感谢您的回答。

4

2 回答 2

11

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()方法是最简单的。

于 2012-12-16T18:13:19.703 回答
9

如果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']

换句话说,+=+应用于列表时更通用。

于 2012-12-16T18:06:03.337 回答