Mit +=
mit einer Liste ist extend
wie der Aufruf, nicht +
.
- Sie können
extend
mit einem iterablen aufrufen.
- Sie können
+
nur mit einer anderen Liste verwenden.
Ich kann nur raten, warum diese Entscheidung getroffen wurde, aber ich stelle mir vor es ist aus Leistungsgründen. Der Aufruf +
führt dazu, dass ein neues Objekt erstellt wird und alle Objekte kopiert werden, während extend
freien Speicherplatz im vorhandenen Listenobjekt verwenden kann und in einigen Fällen eine Kopie speichert.
Ein weiterer Nebeneffekt dieser Entscheidung ist, dass wenn Sie x += y
schreiben andere Hinweise auf die Liste die Änderung sehen, aber wenn Sie x = x + y
verwenden, dann werden sie nicht. Dies wird im Folgenden gezeigt:
>>> 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']
Referenzen
Python source code for list.
Quellcode für +=
:
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;
}
Quellcode für +
:
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 ...
Ich "stimme" mit Ihrer Frage überein; es ist ein gutes Argument gegen die Überlastung des Operators für mich. – u0b34a0f6ae
Löschte meine Antwort nach dem Bearbeiten - es scheint, Sie wundern sich über den Grund hinter nicht unterstützen + zwischen einer Liste und einem iterable - mein Fehler. Anders als zu sagen: "Ja, warum nicht?", Habe ich keine Antwort. –
das ist ein * Haupt * Bruch. Im Allgemeinen sollte jede Sprache oder Bibliothek, die unterschiedliche Verhaltensweisen für gleich aussehende Operatoren definiert, als benutzerfeindlich betrachtet werden. niemand vernünftig würde '+' für String-Verkettung verwenden: Diese Operation ist nicht kommutativ! –