Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.

Entschuldigung für den verwirrenden Titel. Ich denke, es ist einfacher zu verstehen, was es bedeutet, den Code tatsächlich zu betrachten, als ihn in Worten zu erklären. In Bezug auf die Umgebung ist Ruby Ruby 2.0 und Python Python 3.2.

Schreibst du?

Versuchen wir, diesen Code in Ruby zu schreiben.

#Globale Variablen aufgrund des Umfangs
$msg = "Hello, Before World!"

def say(str = $msg)
   puts str
end

say #=> Hello, Before World!

$msg = "Hello, After World!"
say #=> Hello, After World!

Die Ausgabe sollte wie kommentiert sein.

Wenn Sie ähnlichen Code in Python schreiben, sieht er folgendermaßen aus.

msg = "Hello, Before World!"

def say(str = msg):
    print(str)

say() #=> Hello, Before World!

msg = "Hello, After World!"
say() #=> Hello, Before World!

Der Code ist ähnlich, aber die Ausgabe der Funktion "say" hat sich geändert.

Haben Sie eine allgemeine Vorstellung vom Titel bekommen?

Es ist ein Kommentar

Erstens können sowohl Ruby als auch Python beliebige Ausdrücke in die Standardargumentwerte schreiben. Der Zeitpunkt, zu dem dieser Wert ausgewertet wird, unterscheidet sich also zwischen Ruby und Python.

In Ruby **, wenn eine Funktion aufgerufen wird **, In Python wird der Wert des Standardarguments ausgewertet, wenn ** die Funktion definiert ist **.

$msg = "Hello, Before World!"

def say(str = $msg)
   puts str
end

say() #=> Hello, Before World!

$msg = "Hello, After World!"
say() #=>mit diesem Timing$msg wird ausgewertet
    #=>Also, hallo, After World!
msg = "Hello, Before World!"

def say(str = msg): #An dieser Stelle wird msg Hallo ausgewertet, Before World!Es ist geworden
    print(str)

say() #=> Hello, Before World!

msg = "Hello, After World!"
say() #=>Hallo, da der Wert von str bereits festgelegt wurde, Before World!

Das Ergebnis ist also das gleiche wie zuvor.

Verschiedene Gefühle ...

Persönlich denke ich, dass Ruby interessanter ist, weil es verschiedene Dinge tun kann, aber beide Verhaltensweisen sind * natürlich *, also nicht schlecht. (Ich frage mich, ob Python dies aufgrund der VM-Spezifikationen tun muss.)

Übrigens können Sie in Ruby auf andere Argumente als das Standardargument verweisen. Rufen Sie sich also innerhalb des Standardarguments auf und machen Sie es rekursiv.

#Schau, dieser Typ rekursiv mit den Standardargumenten ...
def fact(n,ret = n <= 1 ? 1 : fact(n-1) * n)
   ret
end

puts fact(10) #=> 3628800

Sie können so etwas tun. Ruby ist ... (Entschuldigung).

Übrigens scheint Python diese Eigenschaft zu verwenden, um den lokalen Bereich (wahrscheinlich) zu ersetzen.

say_n = []

for i in range(0,10):
    #say_n.append(lambda: print(i))
    #Wenn ja, wird der Wert von i aktualisiert, so dass es nutzlos ist
    say_n.append(lambda j = i: print(j))
    #Ich muss binden, ich mag das

say_n[2]() #=> 2
say_n[4]() #=> 4

Es war ein sehr verschiedener Tipp, aber wenn Sie sich auf so kleine Unterschiede in den Spezifikationen für jede Sprache einlassen, werden Sie nicht leicht davon loskommen können, daher denke ich, dass es kein Verlust ist, dies zu wissen. Ich hoffe, Sie erinnern sich und finden etwas Nützliches.

Da sowohl Ruby als auch Python Außenseiter sind, kann es zu Fehlern kommen. Wenn Sie es finden, würde ich es begrüßen, wenn Sie Hatoo in den Kommentaren oder auf Twitter ([@ alucky0707]) sanft beißen könnten.

Referenzseite

Recommended Posts

Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Das Einrückungsverhalten von json.dumps unterscheidet sich zwischen python2 und python3
Seien Sie vorsichtig, wenn Sie den Standardargumentwert in der Python 3-Serie angeben
Machen Sie den Standardwert des Arguments unveränderlich
Zusammenfassung der Unterschiede zwischen PHP und Python
Angeben des Bereichs von Ruby- und Python-Arrays
Über den Unterschied zwischen "==" und "is" in Python
Das Verhalten von @property unterscheidet sich zwischen Klassendefinition und alten und neuen Stilen
[Python of Hikari-] Kapitel 06-02 Funktion (Argument und Rückgabewert 1)
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Warum ist das erste Argument der [Python] -Klasse selbst?
[Python Data Frame] Wenn der Wert leer ist, füllen Sie ihn mit dem Wert einer anderen Spalte.
Was ist die Standard-TLS-Version des Python-Anforderungsmoduls?
Unterschied zwischen Ruby und Python Split
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Die Geschichte von Python und die Geschichte von NaN
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Unterschied zwischen == und ist in Python
Erstellen einer Python-Umgebung unter Ubuntu (wenn pip nicht die Standardeinstellung war)
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Python> Extrahieren Sie den Wert von list (entpacken)> Hinzufügen *> Sie haben mir den Unterschied zwischen Python 2 und Python 3 in Bezug auf print (* mylist) / print () beigebracht.
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
[Einführung in Python] Was ist der Unterschied zwischen einer Liste und einem Taple?
Wenn Selenium sagt, dass die Chrome-Treiberversion anders ist (Python)
Unterschiede zwischen Ruby und Python im Umfang
[Python] [Meta] Ist der Python-Typ ein Typ?
Unterschied zwischen Ruby und Python (grundlegende Syntax)
Sind Php / Ruby / Python, die nur ausgeführt werden, wenn die Datei direkt aufgerufen wird
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Teilt die Zeichenfolge durch die angegebene Anzahl von Zeichen. In Ruby und Python.
Der zu bewertende Ort kann sich zwischen der Karten- und Listeneinschlussnotation unterscheiden
Verwenden Sie Ruby und Python, um die Wahrscheinlichkeit zu ermitteln, dass eine Karte mit einer natürlichen Zahl von 1 bis 100 ein Vielfaches von 3 und kein Vielfaches von 5 ist.
Was ist der Unterschied zwischen "pip" und "conda"?
Zusammenfassung der Korrespondenz zwischen Ruby- und Python-Array-Operationen
Der Wert von pyTorch torch.var () wird nicht verteilt
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Berücksichtigung der Stärken und Schwächen von Python
Über flache und tiefe Kopien von Python / Ruby
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Was ist der Unterschied zwischen Unix und Linux?
Suchen Sie den Maximalwert, den Minimalwert und die Anzahl der Elemente, wenn auf die Ganzzahl N N Ganzzahlen in der ersten Zeile mit Standardeingabe folgen.
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
Um den Ort, an dem der Wert von Errbot gespeichert ist
[Python] Berechnen Sie den Durchschnittswert des Pixelwerts RGB des Objekts
Der Prozess der Installation von Atom und der Ausführung von Python
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask
Was ist der Unterschied zwischen usleep, nanosleep und clock_nanosleep?
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Referenz und Änderung der rekursiven Python-Obergrenze
Ich habe mir die Versionen von Blender und Python angesehen
Ich habe das Standardbetriebssystem und die Shell der Docker-Maschine überprüft
Visualisierung der Verbindung zwischen Malware und dem Callback-Server
Prozessübergreifende Kommunikation zwischen Ruby und Python (POSIX-Nachrichtenwarteschlange)
[Django 2.2] Sortieren und erhalten Sie den Wert des Beziehungsziels