据我所知,+ op for list仅要求第二个操作数是可迭代的,而“ha”显然是可迭代的。
在代码中:
>>> x = []
>>> x += "ha"
>>> x
['h', 'a']
>>> x = x + "ha"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
最佳答案
对列表使用+=
就像调用extend
,而不是+
。
extend
。 +
与另一个列表一起使用。 我只能猜测为什么要做出此决定,但我想这是出于性能原因。调用
+
会创建一个新对象并复制所有项目,而extend
可以使用现有列表对象中的可用空间来保存副本(在某些情况下)。该决定的另一个副作用是,如果您将
x += y
写入列表中,则其他引用将看到更改,但是如果您使用x = x + y
,则它们将不会更改。如下所示:>>> x = ['a','b']
>>> y = ['c',d']
>>> z = x
>>> x + = y
>>> z
['A B C D']
>>> x = ['a','b']
>>> y = ['c',d']
>>> z = x
>>> x = x + y
>>> z
['a','b']
引用
Python source code for list。
+=
的源代码:静态PyObject *
list_inplace_concat(PyListObject * self,PyObject * other)
{
PyObject *结果;
结果= listextend(自己,其他);
如果(结果== NULL)
返回结果;
Py_DECREF(结果);
Py_INCREF(自身);
返回(PyObject *)self;
}
+
的源代码:静态PyObject *
list_concat(PyListObject * a,PyObject * bb)
{
Py_ssize_t大小;
Py_ssize_t i;
PyObject ** src,**目标;
PyListObject * np;
如果(!PyList_Check(bb)){
PyErr_Format(PyExc_TypeError,
“只能将列表(而不是\“%。200s\”)串联在一起进行列表”,
bb-> ob_type-> tp_name);
返回NULL;
}
//等等 ...
关于python - 如果x是list,为什么x + = “ha”起作用,而x = x + “ha”抛出异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3216706/