在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()方法是最简单的.
如果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)
换句话说,+=比+应用于列表时更通用.