Le _ (underscore) dans le shell interactif Python


C’est une fonctionnalité que peu de gens connaissent, pourtant très utile.

Dans le shell Python, à chaque fois qu’on évalue une expression, le résultat affiché est référencé dans la variable _.

>>> 1 + 1
2
>>> print _
2

On peut évidement la réutiliser comme n’importe quelle variable:

>>> range(5)
[0, 1, 2, 3, 4]
>>> [x * 2 for x in _]
[0, 2, 4, 6, 8]

Pour éviter d’effacer la variable trop souvent, quand le résultat retourné est None, _ ne change pas, donc il ne change pas quand on print :-)

>>> 1 > 2 or None
>>> _
[0, 2, 4, 6, 8]
>>> print 'a'
a
>>> _
[0, 2, 4, 6, 8]

Ça ne marche que dans le shell, pas dans un script.

12 thoughts on “Le _ (underscore) dans le shell interactif Python

  • foxmask

    j’ai découvert ça avec les présentations de Aymeric Augustin “Django et Python 3” – pratique :)

    dans la même veine du underscore magique ya

    foxmask@localhost:~$ mkdir sam_et_max
    foxmask@localhost:~$ cd $_
    foxmask@localhost:~/sam_et_max$
    foxmask@localhost:~/sam_et_max$ cd ..
    foxmask@localhost:~$ mkdir sam et_max
    foxmask@localhost:~$ cd $_
    foxmask@localhost:~/et_max$

  • Sam Post author

    Ca marche pas chez moi ton deuxième truc. Ca demande une config .bashrc particulière ?

    Moi par contre ça marche avec cd -.

  • foxmask

    nan c’est du bash ; le cd – c’est pour retourner à $OLDPWD et $_ contient le dernier argument de la ligne précédente

  • Baronsed

    J’ai du mal avec le man de bash. C’est quoi la différence avec !$, alors ?

  • Baronsed

    Non, le pid, c’est $$ (ou $BASHPID). !$ et $_ semblent faire la même chose.

  • foxmask

    Petites précisions :)

    le $$ c’est le pid courant
    le $! est le PID du process lancé en background
    $_ est le dernier paramètre tapé de de la ligne précédente

  • Recher

    Cool. Voilà une astuce fun et utile. Merci !

    A noter que si on s’amuse à définir soi-même le underscore, ça ne fonctionne plus. (Mais c’est assez normal)


    >>> 654
    654
    >>> _
    654
    >>> _ = "lol"
    >>> _
    'lol'
    >>> 87542
    87542
    >>> _
    'lol'

    Mon ancien maître-ninja python m’avait dit que c’était une bonne pratique d’utiliser le underscore comme compteur de boucle, lorsqu’on n’a pas besoin de sa valeur dans ladite boucle.

    Exemple :

    for _ in xrange(3):
        print "Patimbert !!!"

    Il vaut donc mieux ne pas utiliser cette bonne pratique en mode console.

    Et à l’occasion, corrigez la faute dans le titre :
    underscode -> underscore.

    Les fautes dans un article, ça ne m’a jamais vraiment dérangé. Mais dans le titre, quand même …

  • foxmask

    toute en discrétion :-) je n’ai pas touché à l’url par contre sinon tout lien existant produirait une 404 .

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.