Übergeben von Werten in Python [Duplicate]
-
22-08-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
- Wie gebe ich eine Variable durch Verweis? 26 Antworten
Wenn Sie eine Sammlung wie Liste übergeben, Array an einem anderen Funktion in Python, ist es eine Kopie davon machen, oder ist es nur ein Zeiger?
Lösung
werden Referenzen zu Objekten Wert .
Python werden Referenzen zu Objekten Wert (wie Java), und alles, was in Python ist ein Objekt. Das klingt einfach, aber dann werden Sie feststellen, dass einige Datentypen scheinen zu zeigen Pass-by-Werteigenschaften, während andere scheinen zu handeln, wie Pass-by-reference ... was ist das Problem?
Es ist wichtig, zu verstehen, wandelbar und unveränderliche Objekte. Einige Objekte, wie Strings, Tupel und Zahlen, sind unveränderlich. Ändern Sie sie in ein Funktion / Methode wird eine neue erstellen Instanz und die ursprüngliche Instanz außerhalb der Funktion / Methode nicht geändert. Andere Aufgaben, wie Listen und Wörterbücher sind wandelbar, die bedeutet, können Sie das Objekt ändern an Ort und Stelle. Daher verändern ein Objekt innerhalb einer Funktion / Methode wird ändert auch das ursprüngliche Objekt außerhalb.
Andere Tipps
Das Ding ist, wird das gesamte Bezug / Wert-Konzept nicht in Python passen. Python hat keinen „Wert“ einer Variablen. Python hat nur Objekte und Namen, die sich auf Objekte beziehen.
Also, wenn Sie eine Funktion aufrufen und einen „Namen“ in der Klammer setzen, wie folgt aus:
def func(x): # defines a function that takes an argument
... # do something here
func(myname) # calling the function
Das eigentliche Objekt, das myname
zeigt übergeben wird, nicht die Namen myname
selbst . Innerhalb der Funktion ein anderer Name (x
) mit dem gleichen Objekt übergeben beziehen gegeben.
Sie können das Objekt innerhalb der Funktion ändern, wenn es wandelbar ist, aber Sie nicht ändern kann, was die Außen Namen zeigt. Genau das gleiche passiert, wenn Sie tun
anothername = myname
Deshalb kann ich Ihre Frage beantworten mit:
es "nach Wert übergeben", aber alle Werte sind nur Verweise auf Objekte.
Antworten hier hilfreich gewesen, aber ich finde die Notwendigkeit, diese feine Unterscheidung zu zeigen, die ich bedeckt nicht gesehen habe, die ich mit dem nachfolgenden CL Experiment mir bewiesen haben:
- Ein unveränderliches Objekt allein kann nicht innerhalb eines Funktionsaufruf geändert werden. (Antworten bisher gesagt haben, dass viel ...)
- ABER, ein unveränderliches Objekt innerhalb eines veränderlichen Objekts enthalten ist, kann in einem Methodenaufruf neu zugeordnet werden.
'num' nicht ändern, weil es ein unveränderliches Number-Objekt ist [unterstützt meine Nummer 1.]:
def incr_num(num):
num += 1
num = 0
num
0
incr_num(num)
num
0
'Liste [0]' hier ist ein unveränderliches Number-Objekt auch.
def incr_list(list):
list[0] += 1
list = [0]
list[0]
0
incr_list(list)
list[0]
1
Wie kommt Liste [0] ', ein unveränderliche Zahl Objekt ist, ändern (unterstützt meinen Punkt 2.), während die Zahl Objekt obigen Beispiel ‚num‘ nicht? Das unveränderliche Number-Objekt Liste [0] 'wird innerhalb der wandelbaren Liste Objekts enthält ‚Liste‘, während ‚num‘ aus dem ersten Beispiel ist nur ein nicht-contianed Number-Objekt.
Obwohl gut gemeint, ich fühle mich @Stephen Pape top-rated Antwort (unten zitiert), und einig andere ähnliche, waren nicht ganz korrekt (und das motiviert mich diese Antwort zu schreiben):
Einige Objekte, wie Strings, Tupel und Zahlen, sind unveränderlich. sie innerhalb einer Funktion / Methode ändern wird eine neue Instanz erstellen und die ursprüngliche Instanz außerhalb der Funktion / Methode wird nicht verändert.
Mein zweiter Code Experiment oben zeigt ein Number-Objekt (Liste [0] ') innerhalb eines Verfahrens verändert wird, und dann wird die ursprüngliche Instanz außerhalb der Funktion geändert.
Eine Referenz übergeben wird, aber wenn der Parameter ist ein unveränderliches Objekt, das innerhalb des Verfahrens modifiziert wird eine neue Instanz erstellen.
Das Objekt wird übergeben. Keine Kopie, sondern ein Verweis auf das darunter liegende Objekt.
würde ich auch am copy
Modul empfehlen, ich:
Python-Dokumentation für die Kopie
Es wird Ihnen helfen, die zugrunde liegenden Probleme zu verstehen und wie es zu benutzen, um Ihre eigene tiefe Kopie auszuführen.
Mit dem Verweis:
>>> x = [0,1,2,3]
>>> def foo(x_list):
x_list[0] = 1
>>> foo(x)
>>> x
[1, 1, 2, 3]
Bitte lassen Sie mich ein bescheidenes Beispiel geben
def swap(a, b):
x = a
print id(x)
print id(a)
print id(b)
a = b
print id(a)
b = x
print id(b)
a[0]= '20'
var1 = ['1','2','3','4']
var2 = ['5','6','7','8','9']
print id(var1)
print id(var2)
swap(var1, var2)
print id(var1)
print id(var2)
print var1
print var2
, welche erzeugt das folgende Ergebnis
28329344 var1 28331264 var2 28329344 x 28329344 ein 28331264 b Nach = b 28331264 ein nach b = x 28329344 b nach der Rückkehr 28329344 var1 28331264 var2 [ '1', '2', '3', '4'] [ '20', '6' '7' '8' '9']
Zuordnung zu den Speicheradressen 28329344 28331264 var1 var2 a b X Nach = b ein Nach b = x b Nach einem [0] '20' = [0] '20' = nach der Rückkehr [ '1', '2', '3', '4'] [ '20', '6' '7' '8' '9']