列表扩展奇怪的行为

ale*_*sel 6 python list

在Python(2.7)中发现了前所未有的有趣之处.

这个:

a = []
a += "a"
Run Code Online (Sandbox Code Playgroud)

工作和结果是:

>>> a
>>> ["a"]
Run Code Online (Sandbox Code Playgroud)

a = []
a = a + "a"
Run Code Online (Sandbox Code Playgroud)

>>> TypeError: can only concatenate list (not "str") to list
Run Code Online (Sandbox Code Playgroud)

有人可以解释原因吗?谢谢你的回答.

Mar*_*ers 11

Python区分++=运算符,并为这些提供单独的钩子; __add____iadd__.该list()类型仅为后者提供不同的实现.

列表单独实现这些更有效; __add__必须返回一个全新的列表,而__iadd__只能延伸self然后返回self.

在C代码中,__iadd__通过list_inplace_concat()简单调用listextend()或者在python代码中实现[].extend().后者按设计采用任何顺序.

__add__另一方面,用C表示的方法list_concat只取一个list输入,可能是为了效率; 它可以直接在内部C数组上循环,并将项目复制到新列表.

总之,__iadd__接受任何序列的原因是因为当实现PEP 203(增强添加提议)时,对于列表来说,重用该.extend()方法是最简单的.


NPE*_*NPE 9

如果a是列表,则a + x只有列表才有效x,而a += x适用于任何可迭代列表x.

以下可能有助于理解它:

In [4]: a = []

In [5]: a += "abc"

In [6]: a
Out[6]: ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

关键是,"a"并且"abc"是可迭代的,这使得它们能够在右侧使用+=.

这不起作用,+因为后者要求两个操作数属于同一类型(参见手册).

要使用相同的东西+,你必须扩展iterable:

In [7]: a = []

In [8]: a = a + list("abc")

In [9]: a
Out[9]: ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

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