Frage

Dies kann für die meisten Sprachen im Allgemeinen, aber ich bin mir nicht sicher. Ich bin ein Anfänger in Python und habe auf den Kopien der Listen in C # und VB immer gearbeitet. Aber in Python, wenn ich eine Liste als Argument übergeben und enumerate durch eine „for i in range“, und dann den Wert der Liste Arguments ändern, wird die Eingabewerte ändern tatsächlich die ursprüngliche Liste. Ich dachte, Python sollte Argumente standardmäßig nach Wert zu übergeben, so dass, sobald die Funktion, die ich noch von den ursprünglichen Werte beendet ist, bevor ich die Funktion aufgerufen. Was vermisse ich? Dank!

War es hilfreich?

Lösung

Python tut Pass Argumente von Wert, sondern der Wert, den Sie empfangen werden, ist eine Kopie der Referenz (übrigens ist dies genau die gleiche Art und Weise, dass C #, VB.NET und Java verhalten als auch).

Dies ist wichtig, daran zu denken:

  

Die Objekte werden nicht als Referenz übergeben -. Objektreferenzen von Wert übergeben werden

Da Sie eine Kopie der Referenz haben, kann jede Maßnahme auf, was das Referenzpunkte sein wird, wie wenn Sie die ursprüngliche Referenz abhielten selbst.

Andere Tipps

Python - wie Java funktioniert für alles andere als primitiv Skalare, und wie C # und VB.NET do für die Standard-Art Parameter zu boxed Typen gegenüber und aus / ref parms - geht „durch Objektreferenz“ (Suche nach dieser Satz hier - es ist, wie Guido, Pythons Architekt und Schöpfer, verwendet diese argument- erklären Passing-Konzept).

Jeder Name ist eine Referenz auf ein Objekt; noch einen weiteren Hinweis auf das gleiche Objekt einen Namen (oder einen anderen Ausdruck) vorbei als ein Argument nur schafft (das ist der Funktionskörper durch die Parameternamen zugreifen kann). ((Es gibt nicht so etwas wie „einen Verweis auf einen Namen“: es gibt Namen , die Objekte eine Art Referenz, und Objekt - Periode)).

Wenn Sie ein veränderbares Objekt vorbei sind, das heißt eine, die Methoden hat mutiert (wie zum Beispiel einer Liste), kann die aufgerufene Funktion das Objekt mutiert durch den Aufruf, die direkt oder indirekt seine mutiert Methoden. ((Mit "indirekt", meine ich "durch Operatoren" - zum Beispiel:

somelist[len(somelist):] = [whatever]

ist genau identisch mit somelist.append(whatever).))

Wenn Sie eine Liste in eine Funktion zu übergeben wollen, aber tun nicht wollen, dass die Funktion in der Lage sein, diese Liste in irgendeiner Weise mutieren können, müssen Sie passieren Kopieren der Liste anstelle des Original -. wie in Java, C #, VB.NET

Be sehr klar über den Unterschied zwischen rebinding einen Namen und mutiert ein Objekt . Rebinding den Namen ( "barename", das ist - mit qualifizierten Namen unterscheiden ;-) nur wirkt ich die Namen - nicht ein beliebige Objekt was auch immer. Zum Beispiel:

def f1(alist):
  alist = [23]

def f2(alist):
  alist[:] = [23]

Können Sie den Unterschied zwischen diesen beiden Funktionen vor Ort? Man ist rebinding die barename alist - ohne Wirkung seitens irgendetwas. Die andere mutiert (Veränderung, Wechsel, ...) die Liste Objekt, um es als Argument empfangen - indem sein Inhalt eine Ein-Punkt-Liste mit einem int als einziges Element zu sein. komplett, ganz verschiedene Dinge !!!

Andrew Antwort hinzuzufügen, müssen Sie explizit eine Kopie einer Liste, wenn Sie das Original behalten möchten. Sie können dies tun, um die copy Modul verwenden, oder einfach nur etwas tun, wie

a = [1,2]
b = list(a)

Da das Kopieren von Objekten in der Regel eine Leistungseinbuße schon sagen, finde ich es hilfreich ausdrücklich das Kopiermodul in meinen größeren Projekten zu verwenden. Auf diese Weise kann ich leicht alle die Orte, wo ich ein paar mehr Speicher verwenden werde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top