68 votes

Assigner une valeur à _ interpréteur Python/IPython

Bonjour dans mon temps libre j’ai codé cette fonction en Python (2.7) avec `` .

plus tard, si vous appelez , vous obtiendrez .

La fonction a disparu ! Si vous essayez d’appeler vous obtiendrez " objet ne peut pas être appelé ». Pourquoi ? Quel est le problème avec cette fonction ?

105voto

Martijn Pieters Points 271458

L'interpréteur Python attribue la dernière expression de la valeur de _.

Ce comportement est limitée à la REPL interprète seulement, et est destiné à aider dans le codage interactif sessions:

>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0

Le standard de l'interpréteur Python va à une certaine longueur pour ne pas empiéter sur les valeurs définies par l'utilisateur, si vous avez vous-même céder quelque chose d'autre pour _ alors que l'interprète n'écrasera pas que (techniquement parlant, l' _ variable est un __builtin__ d'attribut, vos propres assignations sont "régulières" globals). Vous n'êtes pas en utilisant la norme de l'interpréteur Python; vous êtes à l'aide de IPython, et que l'interprète n'est pas un soin.

IPython documents de ce comportement explicitement:

Les variables GLOBALES suivantes existent toujours (donc ne pas les écraser!):

  • [_] (un seul trait de soulignement) : stocke la sortie précédente, comme Python par défaut de l'interprète.

[...]

En dehors de l'interpréteur Python, _ est, par convention, utilisé comme nom de le texte traduisible fonction (voir l' gettext module; outils externes de regarder pour que la fonction d'extraire des chaînes traduisibles).

Dans les boucles, à l'aide de _ comme une affectation cible indique aux lecteurs de votre code que vous allez ignorer que la valeur; par exemple, [random.random() for _ in range(5)] pour générer une liste de 5 aléatoire de valeurs flottantes.

31voto

Ashwini Chaudhary Points 94431

_ est une variable spéciale de l'interprète, il est toujours affecté le résultat de l'expression précédente. Donc, vous shoudn pas l'utiliser comme ça.

BTW, le problème semble être lié à IPython shell, parce que votre code fonctionne très bien en normal python shell:

Normal python shell lorsque vous affecter quoi que ce soit à la variable _ , puis il va rester affectée à cet objet, et il perd des comportements particuliers.


Python shell:

>>> 2*2
4
>>> _         #works as expected
4
>>> _ = 2     #after assignment, it's magic functionality is gone
>>> _*5       
10
>>> _
2

IPython shell:

Dans IPython _ se comporte différemment de python, shell _; même si vous pouvez l'affecter à une variable puis aussi il va être mis à jour dès que vous faites un peu de calcul.

In [1]: 2*2
Out[1]: 4

In [2]: _
Out[2]: 4

In [3]: _ = 10

In [4]: _*10
Out[4]: 100

In [5]: _
Out[5]: 100

De IPython de docs:

Les variables GLOBALES suivantes existent toujours (afin de ne pas les écraser eux!):

_ : (un seul trait de soulignement) : stocke la sortie précédente, comme Python par défaut interprète. ..

À partir de python docs:

L'identificateur spécial _ est utilisé dans l'interpréteur interactif stocker le résultat de la dernière évaluation; il est stocké dans le __builtin__ module. Lorsqu'il n'est pas en mode interactif, _ n'a pas de signification particulière et n'est pas défini.

Remarque: Le nom de l' _ est souvent utilisé en conjonction avec l'internationalisation; reportez-vous à la documentation de l'gettext module pour plus d'informations sur cette convention.

-1voto

Rentsy Points 65

Si vous créez une variable assignée à «  » il obtient masqué/masques le système variable .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X