Использование +=
со списком похоже на вызов 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 для списка .
Исходный код для +=
:
static PyObject *
list_inplace_concat(PyListObject *self, PyObject *other)
{
PyObject *result;
result = <b>listextend</b>(self, other);
if (result == NULL)
return result;
Py_DECREF(result);
Py_INCREF(self);
return (PyObject *)self;
}
Исходный код для +
:
static PyObject *
list_concat(PyListObject *a, PyObject *bb)
{
Py_ssize_t size;
Py_ssize_t i;
PyObject **src, **dest;
PyListObject *np;
if (!PyList_Check(bb)) {
PyErr_Format(PyExc_TypeError,
<b>"can only concatenate list (not \"%.200s\") to list",</b>
bb->ob_type->tp_name);
return NULL;
}
// etc ...