3290 Stimmen

Wie übergebe ich eine Variable per Referenz?

Werden die Parameter als Referenz oder als Wert übergeben? Wie übergebe ich per Referenz, so dass der folgende Code Folgendes ausgibt 'Changed' anstelle von 'Original' ?

class PassByReference:
    def __init__(self):
        self.variable = 'Original'
        self.change(self.variable)
        print(self.variable)

    def change(self, var):
        var = 'Changed'

32 Stimmen

Eine kurze Erklärung/Klarstellung finden Sie in der ersten Antwort auf diese Stackoverflow-Frage . Da Zeichenketten unveränderlich sind, werden sie nicht geändert und es wird eine neue Variable erstellt, so dass die "äußere" Variable immer noch denselben Wert hat.

11 Stimmen

Der Code in BlairConrads Antwort ist gut, aber die Erklärung von DavidCournapeau und DarenThomas ist richtig.

79 Stimmen

Bevor Sie die ausgewählte Antwort lesen, sollten Sie diesen kurzen Text lesen Andere Sprachen haben "Variablen", Python hat "Namen". . Denken Sie an "Namen" und "Objekte" anstelle von "Variablen" und "Referenzen" und Sie sollten viele ähnliche Probleme vermeiden.

-3voto

moe fear Punkte 119

Einfache Antwort:

Wenn Sie in Python wie in C++ eine Objektinstanz erstellen und sie als Parameter übergeben, werden keine Kopien der Instanz selbst erstellt, so dass Sie von außerhalb und innerhalb der Funktion auf dieselbe Instanz verweisen und die Komponentendaten derselben Objektinstanz ändern können, so dass die Änderungen nach außen hin sichtbar sind.

Bei Basistypen verhalten sich Python und C++ auch zueinander gleich, da nun Kopien der Instanzen erstellt werden, so dass die Außenseite eine andere Instanz sieht/verändert als die Innenseite der Funktion. Daher sind Änderungen von innen nach außen nicht sichtbar.

Hier kommt der eigentliche Unterschied zwischen Python und C++:

In C++ gibt es das Konzept der Adresszeiger, und in C++ können Sie stattdessen Zeiger übergeben, wodurch das Kopieren von Basistypen umgangen wird, so dass das Innere der Funktion dieselben Instanzen wie die äußeren beeinflussen kann, so dass die Änderungen auch nach außen hin sichtbar sind. Dies hat keine Entsprechung in Python und ist daher nicht ohne Umgehungen möglich (z. B. durch die Erstellung von Wrapper-Typen).

Solche Zeiger können in Python nützlich sein, sind aber nicht so notwendig wie in C++, weil man in C++ nur eine einzige Entität zurückgeben kann, während man in Python mehrere durch Kommas getrennte Werte zurückgeben kann (d.h. ein Tupel). Wenn Sie also in Python die Variablen a, b und c haben und wollen, dass eine Funktion sie dauerhaft ändert (relativ zur Außenwelt), würden Sie dies tun:

a=4
b=3
c=8

a,b,c=somefunc(a,b,c)
# a,b,c now have different values here

Eine solche Syntax ist in C++ nicht ohne weiteres möglich, daher würde man in C++ stattdessen dies tun:

int a=4
int b=3
int c=8
somefunc(&a,&b,&c)
// a,b,c now have different values here

3 Stimmen

"Bei Grundtypen verhalten sich Python und C++ auch zueinander gleich, indem nun Kopien der Instanzen erstellt werden", nein das ist nicht richtig. Kopien von Objekten werden nie als Teil der Bewertungsstrategie durchgeführt

0 Stimmen

Ihr Kommentar macht keinen Sinn. Sprechen Sie von Python oder C++? Wenn es sich um Python handelt, dann unterscheidet sich die Vorgehensweise des Interpreters darin, ob es sich um Grundtypen handelt oder nicht. Python verwendet intern ein Äquivalent zu einem Stack, um lokale Basisobjekttypen zu verwalten, und diese sind Kopien. Wären sie das nicht, würden die Originale außerhalb des Funktionsaufrufs irreversibel verändert, was sie nicht sind, was die Frage aufwirft, ob Sie Python überhaupt jemals benutzt haben!

3 Stimmen

Ich spreche von Python. Der Interpreter keine Unterscheidung zwischen "Grundtypen" und "anderen Typen" macht Zumindest in CPython, alle Objekte werden auf einem privat verwalteten Heap zugewiesen . Sie scheinen keine Grundkenntnisse über die Interna von Python zu haben, geschweige denn über die Semantik der Sprache

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X