Python, der eine Ganzzahl durch Verweis übergibt

Wie kann ich eine Ganzzahl per Referenz in Python übergeben? Ich möchte den Wert einer Variablen ändern, die ich an die Funktion übergebe. Ich habe gelesen, dass alles in Python Wert ist, aber es muss ein einfacher Trick geben. Zum Beispiel können Sie in Java die Referenztypen von Integer , Long , etc.

  1. Wie kann ich eine Ganzzahl in eine Funktion als Referenz übergeben?
  2. Was sind die besten Praktiken?

Vielen Dank!

  • Java-Äquivalent der Funktionszuordnung in Python
  • Schafft separate Funktionen anstelle einer großen langsamen Bearbeitungszeit?
  • SQLAlchemy Der boolesche Wert dieser Klausel ist nicht definiert
  • Python kann keine Tupel in einer Funktion definieren [duplizieren]
  • Hilfe - Funktionszeiger in Python
  • Zugriff auf das Funktionsattribut, das in einem Dekorateur außerhalb dieses Dekorators erstellt wurde
  • 7 Solutions collect form web for “Python, der eine Ganzzahl durch Verweis übergibt”

    Es funktioniert nicht so gut in python Python übergibt Verweise auf Objekte. Was du in deiner Funktion hast, ist ein Objekt – Du kannst das Objekt (wenn möglich) mutieren. Allerdings sind ganze Zahlen unveränderlich . Ein Workaround ist, die ganze Zahl in einem Container zu übergeben, der mutiert werden kann:

     def change(x): x[0] = 3 x = [1] change(x) print x 

    Das ist hässlich / ungeschickt am besten, aber du wirst es nicht besser machen in Python. Der Grund ist, weil in python, Zuweisung ( = ) nimmt, was Gegenstand ist das Ergebnis der rechten Seite und bindet es auf was auch immer auf der linken Seite * (oder übergibt es an die entsprechende Funktion). Wenn wir das verstehen, können wir sehen, warum es keinen Weg gibt, den Wert eines unveränderlichen Objekts innerhalb einer Funktion zu ändern – Sie können nichts von seinen Attributen ändern, weil es unveränderlich ist und Sie können nicht einfach die "Variable" einen neuen Wert zuweisen Denn dann schaffst du eigentlich ein neues Objekt (das sich von dem alten unterscheidet) und gibt ihm den Namen, den das alte Objekt im lokalen Namensraum hatte.

    Normalerweise ist der Workaround, um einfach das Objekt zurückzugeben, das du möchtest:

     def multiply_by_2(x): return 2*x x = 1 x = multiply_by_2(x) 

    * Im ersten Beispiel Fall oben, 3 tatsächlich geht an x.__setitem__

    Die meisten Fälle, in denen Sie per Referenz übergeben müssen, sind, wo Sie mehr als einen Wert zurück zum Anrufer zurückgeben müssen. Eine "Best Practice" ist es, mehrere Rückgabewerte zu verwenden, was in Python viel einfacher ist als in Sprachen wie Java.

    Hier ist ein einfaches Beispiel:

     def RectToPolar(x, y): r = (x ** 2 + y ** 2) ** 0.5 theta = math.atan2(y, x) return r, theta # return 2 things at once r, theta = RectToPolar(3, 4) # assign 2 things at once 

    Wirklich, die beste Praxis ist, zurückzugehen und zu fragen, ob Sie das wirklich tun müssen. Warum möchtest du den Wert einer Variablen ändern, die du an die Funktion weitergibst?

    Wenn du es für einen schnellen Hack tun musst, ist der schnellste Weg, eine list mit der ganzen Zahl zu übergeben und bei jedem Gebrauch eine [0] , wie die Antwort von mgilson zeigt.

    Wenn du es für etwas Wichtigeres tun musst, schreibe eine class , die ein int als Attribut hat, also kannst du es einfach einstellen Natürlich zwingt dich das dazu, einen guten Namen für die Klasse zu finden, und für das Attribut – wenn du an nichts denken kannst, geh zurück und liest den Satz noch ein paar Mal und verwende dann die list .

    Im Allgemeinen, wenn Sie versuchen, einige Java-Idiom direkt an Python Port, Sie tun es falsch. Auch wenn es etwas direktes (wie bei static / @staticmethod ) gibt, willst du es immer noch nicht in den meisten Python-Programmen verwenden, nur weil du es in Java benutzt hast.

     class PassByReference: def Change(self, var): self.a = var print(self.a) s=PassByReference() s.Change(5) 

    In python wird alles durch den Wert übergeben, aber wenn du einen Zustand ändern möchtest, kannst du den Wert einer Ganzzahl innerhalb einer Liste oder eines Objekts ändern, das an eine Methode übergeben wird.

    In Python ist jeder Wert eine Referenz (ein Zeiger auf ein Objekt), genau wie Nicht-Primitive in Java. Auch, wie Java, hat Python nur übergeben Wert. Also, semantisch sind sie so ziemlich gleich.

    Da Sie Java in Ihrer Frage erwähnen, würde ich gerne sehen, wie Sie erreichen, was Sie in Java wollen. Wenn du es in Java zeigen kannst, kann ich dir zeigen, wie es in Python genau äquivalent ist.

    Vielleicht etwas mehr Selbstdokumentation dann die List-of-Length-1 Trick ist der ol 'leerer Typ Trick:

     def inc_i(v): vi += 1 x = type('', (), {})() xi = 7 inc_i(x) print(xi) 

    8

    Python ist die beste Programmiersprache der Welt.