<分区>
在 Python (2.7) 中发现以前从未提及的有趣的东西。
这个:
a = []
a += "a"
确实有效,结果是:
>>> a
>>> ["a"]
但是
a = []
a = a + "a"
给予
>>> TypeError: can only concatenate list (not "str") to list
谁能解释一下为什么?感谢您的回答。
<分区>
在 Python (2.7) 中发现以前从未提及的有趣的东西。
这个:
a = []
a += "a"
确实有效,结果是:
>>> a
>>> ["a"]
但是
a = []
a = a + "a"
给予
>>> TypeError: can only concatenate list (not "str") to list
谁能解释一下为什么?感谢您的回答。
最佳答案
Python 区分+
和+=
运算符并为它们提供单独的钩子(Hook); __add__
和 __iadd__
. list()
类型只是为后者提供了不同的实现。
列表单独实现这些更有效; __add__
必须返回一个全新的列表,而 __iadd__
可以扩展 self
然后返回 self
。
在C代码中,__iadd__
是由list_inplace_concat()
实现的,它只是调用 listtextend()
,或者在 python 代码中调用 [].extend()
。根据设计,后者采用任何序列。
另一方面,__add__
方法在 C 中用 list_concat
表示, 只需要一个 list
作为输入,可能是为了效率的缘故;它可以直接遍历内部 C 数组并将项目复制到新列表。
总而言之,__iadd__
接受任何序列的原因是因为当 PEP 203 (Augmented Add 提案)已实现,对于列表,最简单的方法是重用 .extend()
方法。
关于python - 列出扩展的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904039/