Informationen zur Python-Referenz

Stolpern Sie in Python

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).

Das Geheimnis des Referenzierens

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.

  1. Zum Zeitpunkt von b = a bezieht sich b auch auf den gleichen Ort wie a
  2. Wenn b [0] = 5 ist, wird ein neues int-Objekt mit dem Wert 5 erstellt, und b [0] verweist erneut auf diesen Ort.
  3. Zu diesem Zeitpunkt bezieht sich a [0], da sich sowohl a als auch b auf denselben Ort beziehen, auch auf den Ort, auf den b [0] neu verweist.
  4. Wenn b = [4,5,6], wird ein neues Listenobjekt erstellt und b verweist auf diesen Speicherort. Zu diesem Zeitpunkt bezieht sich a weiterhin auf den ursprünglichen Speicherort. Es scheint, dass es sich so verhält.

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

Informationen zur Python-Referenz
Python # Über Referenz und Kopie
Über Python-Slices
Über die Einschlussnotation von Python
Über den Referenztyp
Über Python tqdm.
Über die Python-Ausbeute
Über Python, Klasse
Informationen zur Python-Vererbung
Über Python, range ()
Über Python Decorator
Über Python-Dekorateure
Python-Referenzseite
[Python] Über Multi-Prozess
Über Python für Schleife
[Python] Memo über Funktionen
Zusammenfassung über Python3 + OpenCV3
Über Python für ~ (Bereich)
[Python] Memo Über Fehler
Informationen zur Python-Entwicklungsumgebung
Python: Über Funktionsargumente
Python, über die Ausnahmebehandlung
Über Python Pyramid Traversal
Über Python3 ... (Ellipsenobjekt)
[Python] Kapitel 01-01 Über Python (Erster Python)
[Python] Informationen zur Standardeingabe
Über __all__ in Python
[Python] Informieren Sie sich über pip
Fabric unterstützt Python 3
Python
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
Über das Python-Modul venv
Python-Anfänger-Memorandum-Funktion
Über die Aufzählungsfunktion (Python)
Über verschiedene Codierungen von Python 3
Über Python, len () und randint ()
Über Perl, Python, PHP, Ruby
Informationen zu Python-Datums- und Zeitzone
Memorandum über Korrelation [Python]
Ein Memorandum über den Python-Mock
Informationen zu Python-Zeichenfolgenvergleichsoperatoren
Über Python und reguläre Ausdrücke
[Python] Numpy Referenz, Extraktion, Kombination
Über die Funktionen von Python
Über "für _ in range ():" von Python
Informationen zu Python- und Betriebssystemoperationen
Über Python sort () und reverse ()
Ein Hinweis zu [Python] __debug__
Python Hinweis: Über den Vergleich mit is
Informationen zur Installation der Serien Pwntools und Python2
Python: Ein Hinweis zu Klasse 1 "Abstract"
[Python] Lassen Sie uns kurz über die Einschlussnotation schreiben
Über Python-Diktat und sortierte Funktionen
[Python] Was ist @? (Über Dekorateure)
Was war überraschend an Python-Klassen?
Kurzreferenztabelle im Python-Datetime-Format