Python: Was ist der Unterschied zwischen Call-by-Value und Call-by-Object?

Viele Leute sagen, dass in Python Argumente für Funktionen mit einem Call-by-Value-Modell übergeben werden. Wie ich es verstehe, ist es eigentlich keine Call-by-Value-Sprache, sondern ein Call-by-Objekt- oder Call-by-Sharing-Modell.

Was sind die Unterschiede zwischen einem Call-by-Value-Modell und einem Call-by-Objekt-Modell? Was ist ein Beispiel in Python, das zeigt, wie diese Modelle anders sind?

    2 Solutions collect form web for “Python: Was ist der Unterschied zwischen Call-by-Value und Call-by-Object?”

    Sagen, dass es nicht Pass-by-Wert ist nicht richtig. Semantisch ist es pass-by-Wert, und man kann die semantische Äquivalenz zwischen ihm und anderen Pass-by-Value-Sprachen demonstrieren. Allerdings gehört es zu einer bestimmten Unterkategorie von Pass-by-Value-Sprachen, bei denen alle Werte Referenzen (Zeiger) auf Objekte sind (man kann kein Objekt direkt als Wert haben) und viele Leute verwechseln einen Zeiger auf ein Objekt mit dem Objekt selbst. Solche Sprachen beinhalten Java (in Bezug auf Objekte), Python, Ruby, JavaScript, Scheme, Smalltalk, um nur einige zu nennen.

    Um die Verwirrung hinzuzufügen, ist, dass die Gemeinschaften der verschiedenen Sprachen unterschiedliche Terminologie verwenden. Zum Beispiel beschreibt die Java-Community Java als Pass-by-Value konsequent, obwohl Objekte in Java genau die gleiche Semantik wie Objekte in Python und Ruby haben. Allerdings hörst du in den letzteren Sprachgemeinschaften "pass-by-value"

    Pass-by-Wert vs Pass-by-Referenz ist im Wesentlichen eine semantische Unterscheidung, nicht eine von dem, was es verwendet wird. Aber viele (Anfänger) Programmierer kümmern sich nicht so sehr um Semantik und kümmern sich nicht darum, was man damit machen kann. Zum Beispiel denken manche Leute, wenn du "Ich habe einige Daten, die ich einer Funktion gebe und es kann es ändern, ohne es zurückzugeben, und ich kann die Änderungen sehen", das heißt Pass-by-Referenz, ohne tatsächlich zu denken ( Oder Sorgen) darüber, ob das Ding, das geändert wurde, das war, was du bestanden hast, oder etwas, das indirekt darauf hingewiesen wurde, was du bestanden hast.

    "Pass by Object" oder "Pass by Sharing" oder was auch immer ein Begriff ist, der geprägt ist, um die Kombination von Pass-by-Value-Semantik zu beschreiben, wobei alle Werte Referenzen (Zeiger) sind. Auf diese Weise können sie die tatsächlichen Wirkungen einer solchen Kombination leichter ausdrücken und sie beispielsweise von den Wirkungen des Pass-by-Wertes in C unterscheiden. Aber semantisch ist es immer noch pass-by-value. Sagen, dass Variablen sind "Namen" oder "Handles", die "gebunden", um Objekte und dass, wenn Sie zuweisen oder übergeben, teilen Sie das Objekt, ist genau gleichbedeutend mit sagen, dass Variablen (und in der Tat alle Werte in der Sprache) Sind Zeiger auf Objekte, und wenn du sie ordnest oder weitergibst, werden diese Zeiger mit dem Wert kopiert.

    Variablen in Python sind keine Werte, sie sind Objektreferenzen. Wenn Sie eine Python-Funktion aufrufen, sind die Argumente Kopien der Verweise auf das ursprüngliche Objekt. Ich weiß nicht, wie sich das auf die Terminologie bezieht, die Sie in der Frage gestellt haben.

    Betrachten Sie zum Beispiel den folgenden Python-Code:

    def foo(bar, baz): bar = 3 baz[0] = 4 a = 1 b = [2] foo(a, b) print a, b 

    a ist dem Objekt 1 und b ist dem b zugeordnet, das einen Verweis auf das Objekt 2 . Innerhalb der Funktion foo ist auch bar dem gleichen Objekt 1 und baz ist dem gleichen baz zugeordnet. Da 1 ist unveränderlich können Sie das Objekt nicht ändern, aber Sie können bar zuweisen, um auf ein anderes Objekt wie 3 zu verweisen. Eine Liste ist modifizierbar, also durch das Setzen von baz[0] auf 4 ändern Sie auch das Listenobjekt, auf das b verweist. Die Ausgabe der oben genannten wird 1 [4] .

    Python ist die beste Programmiersprache der Welt.