Le moment auquel la valeur de l'argument par défaut est évaluée diffère entre Ruby et Python.

Désolé pour le titre déroutant. Je pense qu'il est plus facile de comprendre ce que signifie réellement regarder le code que de l'expliquer avec des mots. En ce qui concerne l'environnement, Ruby est Ruby 2.0 et Python est Python 3.2.

Eh bien, écrivez-vous

Essayons d'écrire ce code en Ruby.

#Variables globales en raison de la portée
$msg = "Hello, Before World!"

def say(str = $msg)
   puts str
end

say #=> Hello, Before World!

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

La sortie doit être comme commentée.

Si vous écrivez un code similaire en Python, il ressemblera à ceci.

msg = "Hello, Before World!"

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

say() #=> Hello, Before World!

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

Le code est similaire, mais la sortie de la fonction «say» a changé.

Avez-vous une idée générale du titre?

C'est un commentaire

Premièrement, Ruby et Python peuvent écrire des expressions arbitraires dans les valeurs d'argument par défaut. Ainsi, le moment auquel cette valeur est évaluée diffère entre Ruby et Python.

Dans Ruby, ** lorsqu'une fonction est appelée **, En Python, la valeur de l'argument par défaut est évaluée lorsque ** la fonction est définie **.

$msg = "Hello, Before World!"

def say(str = $msg)
   puts str
end

say() #=> Hello, Before World!

$msg = "Hello, After World!"
say() #=>avec ce timing$msg est évalué
    #=>Alors bonjour, After World!
msg = "Hello, Before World!"

def say(str = msg): #À ce stade, msg est évalué Bonjour, Before World!Il est devenu
    print(str)

say() #=> Hello, Before World!

msg = "Hello, After World!"
say() #=>Bonjour car la valeur de str a déjà été décidée, Before World!

Donc, le résultat est le même qu'avant.

Sentiments divers ...

Personnellement, je pense que Ruby est plus intéressant car il peut faire diverses choses, mais les deux comportements sont * naturels *, donc ce n'est pas mal. (Je me demande si Python doit le faire à cause des spécifications de la VM)

Au fait, dans Ruby, vous pouvez faire référence à des arguments autres que l'argument par défaut, donc en s'appelant dans l'argument par défaut et en le rendant récursif,

#Ecoute, ce type récursivement avec les arguments par défaut ...
def fact(n,ret = n <= 1 ? 1 : fact(n-1) * n)
   ret
end

puts fact(10) #=> 3628800

Vous pouvez faire quelque chose comme ça. Ruby est ... (excusez-moi).

Au fait, il semble que Python utilise cette propriété pour remplacer la portée locale (probablement).

say_n = []

for i in range(0,10):
    #say_n.append(lambda: print(i))
    #Si tel est le cas, la valeur de i sera mise à jour, il est donc inutile
    say_n.append(lambda j = i: print(j))
    #J'ai besoin de lier j'aime ça

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

C'était une astuce très diverse, mais si vous devenez accro à d'aussi petites différences dans les spécifications pour chaque langue, vous ne pourrez pas vous en sortir facilement, donc je pense que ce n'est pas une perte de savoir. J'espère que vous vous en souvenez et que vous trouverez quelque chose d'utile.

Puisque Ruby et Python sont tous deux des étrangers, il peut y avoir des erreurs. Si vous le trouvez, j'apprécierais que vous mordiez gentiment Hatoo dans les commentaires ou sur Twitter ([@ alucky0707]).

Page de référence

Recommended Posts

Le moment auquel la valeur de l'argument par défaut est évaluée diffère entre Ruby et Python.
La réponse de "1/2" est différente entre python2 et 3
Le comportement de retrait de json.dumps est différent entre python2 et python3
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3
Rendre la valeur par défaut de l'argument immuable
Résumé des différences entre PHP et Python
Spécification de la plage des tableaux ruby et python
À propos de la différence entre "==" et "is" en python
Le comportement de @property est différent entre la définition de classe et les styles anciens et nouveaux
[Python of Hikari-] Chapitre 06-02 Fonction (argument et valeur de retour 1)
Différence entre Ruby et Python en termes de variables
Pourquoi le premier argument de la classe [Python] est-il self?
[Python Data Frame] Lorsque la valeur est vide, remplissez-la avec la valeur d'une autre colonne.
Quelle est la version TLS par défaut du module de requêtes python?
Différence entre Ruby et Python Split
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
L'histoire de Python et l'histoire de NaN
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Différence entre == et est en python
Construire un environnement Python sur Ubuntu (lorsque pip n'était pas la valeur par défaut)
Que faire lorsque le type de valeur est ambigu en Python?
Python> Extraire la valeur de list (unpack)> Add *> Vous m'avez appris la différence entre Python 2 et Python 3 concernant print (* mylist) / print ().
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
[Introduction à Python] Quelle est la différence entre une liste et un taple?
Quand Selenium dit que la version du pilote Chrome est différente (Python)
Différences entre Ruby et Python dans la portée
[python] [meta] Le type de python est-il un type?
Différence entre Ruby et Python (syntaxe de base)
Sont Php / Ruby / Python qui ne s'exécute que lorsque le fichier est appelé directement
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
Divise la chaîne de caractères par le nombre de caractères spécifié. En Ruby et Python.
Le lieu à évaluer peut être différent entre la notation d'inclusion de carte et de liste
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.
Quelle est la différence entre «pip» et «conda»?
Résumé de la correspondance entre les opérations de tableau ruby et python
La valeur de pyTorch torch.var () n'est pas distribuée
Découvrez la fraction de la valeur saisie en python
Comparez la vitesse d'ajout et de carte Python
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
Ceci est le seul examen de base de Python ~ 3 ~
Prise en compte des forces et faiblesses de Python
À propos des copies superficielles et profondes de Python / Ruby
Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)
Quelle est la différence entre Unix et Linux?
Trouvez la valeur maximale, la valeur minimale et le nombre d'éléments lorsque l'entier N est suivi de N entiers sur la première ligne de l'entrée standard.
Prise en compte de la différence entre la courbe ROC et la courbe PR
Autour de l'endroit où la valeur d'Errbot est stockée
[Python] Calculez la valeur moyenne de la valeur de pixel RVB de l'objet
Le processus d'installation d'Atom et de l'exécution de Python
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
[Ruby vs Python] Comparaison de référence entre Rails et Flask
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Visualisez la gamme d'insertions internes et externes avec python
Référence et modification de la limite supérieure récursive Python
J'ai vérifié les versions de Blender et Python
J'ai vérifié le système d'exploitation et le shell par défaut de docker-machine
Visualisation de la connexion entre le malware et le serveur de rappel
Communication inter-processus entre Ruby et Python (file d'attente de messages POSIX)
[Django 2.2] Trier et obtenir la valeur de la destination de la relation