据我所知,+ 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/

    10-12 03:51