Using += with a list is like calling extend , not + .
- You can invoke
extend with iteration. - You can only use
+ with a different list.
I can only guess why this decision was made, but I think it is for performance reasons. Calling + leads to the creation of a new object and the copying of all elements, while extend can use the free space in an existing list object, saving a copy in some cases.
Another side effect of this solution is that if you write x += y , other links to the list will see this change, but if you use x = x + y , then they will not. This is shown below:
>>> 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']
References
Python source code for a list .
Source code for += :
static PyObject *
list_inplace_concat (PyListObject * self, PyObject * other)
{
PyObject * result;
result = listextend (self, other);
if (result == NULL)
return result;
Py_DECREF (result);
Py_INCREF (self);
return (PyObject *) self;
}
Source code for + :
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,
"can only concatenate list (not \"%. 200s \ ") to list",
bb-> ob_type-> tp_name);
return NULL;
}
// etc ...
Mark Byers Jul 09 2018-10-10T00: 00-07
source share