Python-Dokument sagt, dass das Schneiden einer Liste eine neue Liste zurückgibt.
Wenn nun eine "neue" Liste zurückgegeben wird, habe ich die folgenden Zweifel in Bezug auf "Zuordnung zu Slices".
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Jetzt wäre die Ausgabe:
[4, 5, 3]
- Wie kann etwas, das etwas zurückgibt, auf die linke Seite des Ausdrucks kommen?
- Ja, ich habe die Dokumente gelesen und es heißt, dass dies möglich ist. Da das Schneiden einer Liste eine "neue" Liste zurückgibt, warum wird die ursprüngliche Liste geändert? Ich kann die Mechanik dahinter nicht verstehen.
a[0] = 4
tun würde?=
Anstatt dies als ungültige Syntax zu verwerfen, verwandelt Python es in etwas, das eher dem entspricht, was Sie vielleicht erwarten. Da Python keine Referenzen hat, würde es nicht funktionieren, wenn das Ergebnis eines Slice die ursprüngliche Liste ändert. Du bekommst eine Kopie. Wenn Sie weitere Informationen zu Ihrer Anwendung angegeben haben, können wir Ihnen möglicherweise besser dabei helfen, die Dinge auf "pythonische" Weise zu erledigen. :)Antworten:
Sie verwechseln zwei unterschiedliche Operationen, die eine sehr ähnliche Syntax verwenden:
1) Schneiden:
Dadurch wird eine Kopie des Slice erstellt
a
und zugewiesenb
.2) Slice-Zuordnung:
Dies ersetzt das Slice von
a
durch den Inhalt vonb
.Obwohl die Syntax ähnlich ist (ich stelle mir das vor!), Sind dies zwei verschiedene Operationen.
quelle
start=1
,stop=None
. Dadurch werden Kopien vermieden und eine verzögerte Auswertung verwendet (in Ihrem Fall ein verzögerter Zugriff auf die ursprüngliche Liste).Wenn Sie
a
auf der linken Seite des=
Operators angeben , verwenden Sie die normale Zuweisung von Python , mit der der Namea
im aktuellen Kontext so geändert wird, dass er auf den neuen Wert verweist. Dies ändert nichts an dem vorherigen Wert, auf den gezeigta
wurde.Indem Sie
a[0:2]
auf der linken Seite des=
Operators angeben, teilen Sie Python mit, dass Sie die Slice-Zuweisung verwenden möchten . Die Slice-Zuweisung ist eine spezielle Syntax für Listen, mit der Sie Inhalte aus einer Liste einfügen, löschen oder ersetzen können:Einfügen :
Löschung :
Ersatz :
Hinweis:
Die Slice-Zuweisung bietet eine ähnliche Funktion wie das Auspacken von Tupeln . Zum Beispiel
a[0:1] = [4, 5]
ist äquivalent zu:Mit Tuple Unpacking können Sie nicht sequentielle Listen ändern:
Das Auspacken von Tupeln ist jedoch auf das Ersetzen beschränkt, da Sie keine Elemente einfügen oder entfernen können.
Vor und nach all diesen Operationen
a
ist die gleiche genaue Liste. Python bietet einfach einen guten syntaktischen Zucker, um eine Liste an Ort und Stelle zu ändern.quelle
a[:] = some_list
gleichwertiga = some_list[:]
odera = some_list
?a[:] = some_list
setzt jedes Element vona
auf das vonsome_list
. Wenn Sie eine der von Ihnen erwähnten Aktionen ausführen, ändert sich das, wasa
ist. Zum Beispiel :a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
. Die letzte Zeile wäre False, wenn dera
Wert geändert würde , anstatt ihn zu mutieren.Ich bin auf dieselbe Frage gestoßen, die sich auf die Sprachspezifikation bezieht. Nach Zuweisung-Aussagen ,
Wenn die linke Seite der Zuweisung ein Abonnement ist, ruft Python
__setitem__
dieses Objekt auf.a[i] = x
ist äquivalent zua.__setitem__(i, x)
.Wenn die linke Seite der Zuweisung Slice ist, ruft Python ebenfalls auf
__setitem__
, jedoch mit unterschiedlichen Argumenten:a[1:4]=[1,2,3]
entsprichta.__setitem__(slice(1,4,None), [1,2,3])
Aus diesem Grund verhält sich das Listen-Slice auf der linken Seite von '=' anders.
quelle
Durch Schneiden auf der linken Seite eines Zuweisungsvorgangs geben Sie an, welchen Elementen zugewiesen werden soll.
quelle