À l'aide de +=
avec une liste, c'est comme appeler extend
, pas +
.
- Vous pouvez appeler
extend
avec un objet iterable.
- Vous ne pouvez utiliser qu'
+
avec une autre liste.
Je ne peux que deviner pourquoi cette décision a été prise, mais j'imagine que c'est pour des raisons de performances. Appelant +
résultats dans un nouvel objet qui est créé et tous les articles copiés, alors que extend
pouvez utiliser l'espace libre dans la liste existante de l'objet permet d'enregistrer une copie dans certains cas.
Une autre conséquence de cette décision est que si vous écrivez x += y
autres références à la liste va voir le changement, mais si vous utilisez x = x + y
alors qu'ils ne le seront pas. Cela est démontré ci-dessous:
>>> 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']
Références
Code source Python pour liste.
Le code Source pour +=
:
statique PyObject *
list_inplace_concat(PyListObject *auto, PyObject *autres)
{
PyObject *résultat;
résultat = listextend(self, autre);
if (result == NULL)
résultat de retour;
Py_DECREF(result);
Py_INCREF(auto);
retour (PyObject *)auto;
}
Le code Source pour +
:
statique PyObject *
list_concat(PyListObject *, PyObject *bb)
{
Py_ssize_t taille;
Py_ssize_t i;
PyObject **src, **dest;
PyListObject *np;
if (!PyList_Check(bb)) {
PyErr_Format(PyExc_TypeError,
"ne peut concaténer liste (pas de \"%.200\") à la liste",
bb->ob_type->tp_name);
return NULL;
}
// etc ...