Inhaltsverzeichnis
zeigt.
Jemand hat darauf hingewiesen, dass dies nicht die ursprüngliche Frage von @david beantwortet: „Kann ich irgendetwas tun, um die Variable als tatsächliche Referenz zu übergeben?“. Lasst uns hart arbeiten.
Heim Backend-Entwicklung Python-Tutorial Wie übergebe ich eine Variable als Referenz?

Wie übergebe ich eine Variable als Referenz?

Feb 09, 2024 pm 08:00 PM
作用域

Wie übergebe ich eine Variable als Referenz?

Frageninhalt

Ich habe diesen Kurs zum Testen geschrieben:

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

    def change(self, var):
        var = 'Changed'
Nach dem Login kopieren

Wenn ich versuche, eine Instanz zu erstellen, ist die Ausgabe original。所以python中的参数似乎是按值传递的。那是对的吗?如何修改代码才能达到引用传递的效果,使得输出为changed?

Manchmal sind Leute überrascht von x = 1 这样的代码(其中 x 是参数名称)不会影响调用者的参数,但像 x[0] = 1 这样的代码却会影响调用者的参数。发生这种情况是因为尽管有 = wie Syntax, aber Item-Zuweisung und Slice-Zuweisung sind Methoden zur Mutationvorhandenen Objekten, anstatt Variablen neu zuzuweisen. Siehe Warum kann eine Funktion einige Parameter so ändern, wie sie vom Aufrufer wahrgenommen werden, andere jedoch nicht? Erfahren Sie mehr.

Siehe auch Was ist der Unterschied zwischen Referenzübergabe und Wertübergabe? Für wichtige, sprachunabhängige Terminologiediskussionen.


Die richtige Antwort

Parameter werden durch Zuweisung übergeben

. Dafür gibt es zwei Gründe:
  1. Der übergebene Parameter ist eigentlich eine Referenz
  2. auf das Objekt (die Referenz wird jedoch als Wert übergeben)
  3. Einige Datentypen sind veränderbar, andere jedoch nicht

Also:
  • Wenn Sie ein veränderliches

    Objekt an eine Methode übergeben, erhält die Methode einen Verweis auf dasselbe Objekt und Sie können es beliebig ändern. Wenn Sie sich jedoch innerhalb der Methode befinden, weiß der äußere Bereich nichts Danach wird die externe Referenz immer noch auf das ursprüngliche Objekt verweisen.
  • Wenn Sie ein unveränderliches

    Objekt an eine Methode übergeben, können Sie die externe Referenz immer noch nicht erneut binden oder das Objekt sogar ändern.

Um dies deutlicher zu veranschaulichen, geben wir einige Beispiele.

Liste – veränderlicher Typ

Versuchen wir, die an die Methode übergebene Liste zu ändern:

def try_to_change_list_contents(the_list):
    print('got', the_list)
    the_list.append('four')
    print('changed to', the_list)

outer_list = ['one', 'two', 'three']

print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)
Nach dem Login kopieren

Ausgabe:

before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
Nach dem Login kopieren
outer_listDa es sich bei dem übergebenen Parameter um einen Verweis auf

und nicht um eine Kopie davon handelt, können wir ihn mithilfe der Mutationslistenmethode ändern und die Änderungen im äußeren Bereich widerspiegeln.

Jetzt wollen wir sehen, was passiert, wenn wir versuchen, die als Parameter übergebene Referenz zu ändern:

def try_to_change_list_reference(the_list):
    print('got', the_list)
    the_list = ['and', 'we', 'can', 'not', 'lie']
    print('set to', the_list)

outer_list = ['we', 'like', 'proper', 'english']

print('before, outer_list =', outer_list)
try_to_change_list_reference(outer_list)
print('after, outer_list =', outer_list)
Nach dem Login kopieren

Ausgabe:

before, outer_list = ['we', 'like', 'proper', 'english']
got ['we', 'like', 'proper', 'english']
set to ['and', 'we', 'can', 'not', 'lie']
after, outer_list = ['we', 'like', 'proper', 'english']
Nach dem Login kopieren
the_list 参数是按值传递的,因此为其分配新列表不会对方法外部的代码产生任何影响。 the_listouter_list 引用的副本,我们让 the_list 指向一个新列表,但无法更改 outer_listDa der Parameter the_list als Wert übergeben wird, hat die Zuweisung einer neuen Liste keine Auswirkungen auf den Code außerhalb der Methode. the_list ist eine Kopie dessen, worauf

verweist. Wir lassen the_list auf eine neue Liste verweisen, können aber nicht ändern, wohin

zeigt.

String – unveränderlicher Typ

Es ist unveränderlich, daher können wir den Inhalt der Zeichenfolge nicht ändern

Jetzt versuchen wir, die Referenz zu ändern

def try_to_change_string_reference(the_string):
    print('got', the_string)
    the_string = 'in a kingdom by the sea'
    print('set to', the_string)

outer_string = 'it was many and many a year ago'

print('before, outer_string =', outer_string)
try_to_change_string_reference(outer_string)
print('after, outer_string =', outer_string)
Nach dem Login kopieren

Ausgabe: the_string 参数是按值传递的,因此为其分配新字符串不会对方法外部的代码看到任何影响。 the_stringouter_string 引用的副本,我们让 the_string 指向一个新字符串,但无法更改 outer_string

before, outer_string = it was many and many a year ago
got it was many and many a year ago
set to in a kingdom by the sea
after, outer_string = it was many and many a year ago
Nach dem Login kopieren

Noch einmal, aufgrund der

Punkte.

Ich hoffe, das macht die Sache klarer.

EDIT:

Jemand hat darauf hingewiesen, dass dies nicht die ursprüngliche Frage von @david beantwortet: „Kann ich irgendetwas tun, um die Variable als tatsächliche Referenz zu übergeben?“. Lasst uns hart arbeiten.

Wie lösen wir dieses Problem?

Wie die Antwort von @andrea zeigt, können Sie neue Werte zurückgeben. Dadurch ändert sich nichts an der Art und Weise, wie Inhalte weitergegeben werden, aber es ermöglicht Ihnen, die gewünschten Informationen zu erhalten:

def return_a_whole_new_string(the_string):
    new_string = something_to_do_with_the_old_string(the_string)
    return new_string

# then you could call it like
my_string = return_a_whole_new_string(my_string)
Nach dem Login kopieren

Wenn Sie die Verwendung des Rückgabewerts wirklich vermeiden möchten, können Sie eine Klasse erstellen, die Ihren Wert enthält, und ihn an die Funktion übergeben oder eine vorhandene Klasse verwenden, z. B. eine Liste:

def use_a_wrapper_to_simulate_pass_by_reference(stuff_to_change):
    new_string = something_to_do_with_the_old_string(stuff_to_change[0])
    stuff_to_change[0] = new_string

# then you could call it like
wrapper = [my_string]
use_a_wrapper_to_simulate_pass_by_reference(wrapper)

do_something_with(wrapper[0])
Nach dem Login kopieren
🎜Obwohl das etwas mühsam erscheint. 🎜

Das obige ist der detaillierte Inhalt vonWie übergebe ich eine Variable als Referenz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verwendung der Typedef-Struktur in der C-Sprache Verwendung der Typedef-Struktur in der C-Sprache May 09, 2024 am 10:15 AM

typedef struct wird in der C-Sprache zum Erstellen von Strukturtypaliasen verwendet, um die Verwendung von Strukturen zu vereinfachen. Es weist einem neuen Datentyp ein Alias ​​auf eine vorhandene Struktur zu, indem es den Strukturalias angibt. Zu den Vorteilen gehören verbesserte Lesbarkeit, Wiederverwendung von Code und Typprüfung. Hinweis: Die Struktur muss vor der Verwendung eines Alias ​​definiert werden. Der Alias ​​muss im Programm eindeutig sein und nur innerhalb des Bereichs gültig sein, in dem er deklariert ist.

So lösen Sie die in Java erwartete Variable So lösen Sie die in Java erwartete Variable May 07, 2024 am 02:48 AM

Variablenerwartungsausnahmen in Java können gelöst werden durch: Initialisierung von Variablen; Verwendung von Nullwerten; Verwendung von Überprüfungen und Zuweisungen;

Vor- und Nachteile von Verschlüssen in js Vor- und Nachteile von Verschlüssen in js May 10, 2024 am 04:39 AM

Zu den Vorteilen von JavaScript-Abschlüssen gehören die Aufrechterhaltung des variablen Bereichs, die Aktivierung von modularem Code, die verzögerte Ausführung und die Ereignisbehandlung. Zu den Nachteilen zählen Speicherverluste, erhöhte Komplexität, Leistungsaufwand und Auswirkungen der Bereichskette.

Was bedeutet include in c++? Was bedeutet include in c++? May 09, 2024 am 01:45 AM

Die Präprozessoranweisung #include in C++ fügt den Inhalt einer externen Quelldatei in die aktuelle Quelldatei ein und kopiert ihren Inhalt an die entsprechende Stelle in der aktuellen Quelldatei. Wird hauptsächlich zum Einschließen von Header-Dateien verwendet, die im Code benötigte Deklarationen enthalten, z. B. #include <iostream>, um Standard-Eingabe-/Ausgabefunktionen einzubinden.

C++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus C++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus May 09, 2024 am 11:06 AM

Lebenszyklus von C++-Smartpointern: Erstellung: Smartpointer werden erstellt, wenn Speicher zugewiesen wird. Eigentumsübertragung: Übertragen Sie das Eigentum durch einen Umzugsvorgang. Freigabe: Speicher wird freigegeben, wenn ein Smart Pointer den Gültigkeitsbereich verlässt oder explizit freigegeben wird. Objektzerstörung: Wenn das Objekt, auf das gezeigt wird, zerstört wird, wird der intelligente Zeiger zu einem ungültigen Zeiger.

Können die Definition und der Aufruf von Funktionen in C++ verschachtelt werden? Können die Definition und der Aufruf von Funktionen in C++ verschachtelt werden? May 06, 2024 pm 06:36 PM

Dürfen. C++ erlaubt verschachtelte Funktionsdefinitionen und Aufrufe. Externe Funktionen können integrierte Funktionen definieren und interne Funktionen können direkt innerhalb des Bereichs aufgerufen werden. Verschachtelte Funktionen verbessern die Kapselung, Wiederverwendbarkeit und Bereichskontrolle. Interne Funktionen können jedoch nicht direkt auf lokale Variablen externer Funktionen zugreifen, und der Rückgabewerttyp muss mit der Deklaration der externen Funktion übereinstimmen. Interne Funktionen können nicht selbstrekursiv sein.

Es gibt mehrere Situationen, auf die dies in js hinweist Es gibt mehrere Situationen, auf die dies in js hinweist May 06, 2024 pm 02:03 PM

Zu den Zeigertypen gehören in JavaScript: 1. Globales Objekt; 3. Konstruktoraufruf; 5. Pfeilfunktion (erbt dies); Darüber hinaus können Sie mit den Methoden bind(), call() und apply() explizit festlegen, worauf dies hinweist.

Der Unterschied zwischen let und var in vue Der Unterschied zwischen let und var in vue May 08, 2024 pm 04:21 PM

In Vue gibt es beim Deklarieren von Variablen zwischen let und var einen Unterschied im Gültigkeitsbereich: Gültigkeitsbereich: var hat einen globalen Gültigkeitsbereich und let hat einen Gültigkeitsbereich auf Blockebene. Bereich auf Blockebene: var erstellt keinen Bereich auf Blockebene, let erstellt einen Bereich auf Blockebene. Neudeklaration: var ermöglicht die Neudeklaration von Variablen im gleichen Bereich, let jedoch nicht.

See all articles