Wie in den Kommentaren erwähnt, gibt es in Python überhaupt keine Referenzübergabe. Lesen Sie den folgenden Artikel. https://qiita.com/raccy/items/d4c5e7995a8fc90109ee#_reference-de4299be58ab9d936fcb
Es gibt einige Ungenauigkeiten in diesem Artikel, teilweise weil ich ihn geschrieben habe, als mir eindeutig das Verständnis fehlte, aber ich möchte ihn als Notiz darüber hinterlassen, wie ich mit den Fragen umgegangen bin, die ich zu dieser Zeit hatte (hinterlassen Sie eine Notiz). Kann nicht gut sein).
Als ich Python zum ersten Mal startete, stieß ich als erstes auf die mysteriöse Erklärung, die oft überall zu sehen ist: "Alle Python-Argumente werden als Referenz übergeben." Ich habe das Vorbeigehen irgendwie verstanden. Wenn Sie jedoch den folgenden Code mit Python ausführen, ...
>>> a=1
>>> b=a
>>> b=2
>>> print(a,b)
1,2
Wird sein. Nun, ich denke, es ist natürlich, aber ich bin nicht überzeugt, ob es als Referenz übergeben wird (es scheint natürlich, dass ich nicht überzeugt war, weil es überhaupt nicht als Referenz übergeben wurde). Denn wenn Sie als Referenz übergeben
>>> a=1
>>> b=a
>>> b=2
>>> print(a,b)
2,2
Weil es so sein sollte (dieses Verständnis zu dieser Zeit scheint richtig gewesen zu sein). Ich dachte: "Wenn b = a als Referenz ist, wenn b und a denselben Speicher teilen und b neu geschrieben wird, wird auch a neu geschrieben." In der Tat tut es etwas Ähnliches in der Liste.
>>> a=[1,2,3]
>>> b=a
>>> b[0]=5
>>> print(a,b)
#[5,1,2],[5,1,2]
Wenn es als Referenz übergeben wird, ist es das Verhalten. Das heißt, diejenigen, die mehrere Elemente enthalten können, werden als Referenz übergeben, und ich habe mich gefragt, ob nur der numerische Typ unterschiedlich ist und wann ich die Speicherorte von a und b mit dem folgenden Code überprüfe, ...
>>> a=1
>>> b=a
>>> print(id(a)==id(b))
True
>>> b=2
>>> print(id(a)==id(b))
False
Wenn also b = a ist, beziehen sich sowohl b als auch a auf dieselbe Stelle. Wenn jedoch b = 2 ist, bezieht sich b auf die Position des neu erstellten int-Objekts mit dem Wert 2. Andererseits bezieht sich a weiterhin auf den ursprünglichen Ort. Ich verstehe. Dieses Mal ist das Listenbeispiel jedoch verwirrender. Also, wenn ich nachschaue
>>> a=[1,2,3]
>>> b=a
>>> a_0=a[0]
>>> b[0]=5
>>> print(a[0])
5
>>> print(id(a)==id(b))
True
>>> print(id(a[0])==id(a_0))
False
>>> b=[4,5,6]
>>> print(id(a)==id(b))
False
Damit bin ich endlich überzeugt. Mit anderen Worten.
Ich habe es lange geschrieben, das heißt, Wenn der Variablen __ ein neues Objekt selbst zugewiesen wird, bezieht es sich auf den Ort, an dem das neue Objekt erstellt wurde, anstelle des vorherigen Referenzziels. __ __ In der Praxis sollte es kein Problem geben.
Recommended Posts