在 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']
换句话说,+=比+应用于列表时更通用。