39 votes

Pourquoi True et False ont-ils été changés en mots-clés dans Python 3

En Python 2, nous avons pu réaffecter True et False (mais pas None), mais tous les trois (True, False, et None) ont été considérés comme builtin variables. Cependant, dans Py3k tous les trois ont été remplacés par des mots-clés comme par les docs.

De ma propre spéculation, je ne pouvais que deviner que c'était pour empêcher les manigances comme ce qui dérivent de l'ancien True, False = False, True blague. Toutefois, en Python 2.7.5, et peut-être avant, des déclarations telles que None = 3 qui réaffectés None soulevées SyntaxError: cannot assign to None.

Sémantiquement, je ne crois pas qu' True, False, et None sont des mots clés, car ils sont au dernier sémantiquement littéraux, qui est ce que Java a fait. J'ai vérifié PEP 0 (l'index) et je ne pouvais pas trouver un PEP en expliquant pourquoi ils l'ont changé.

Existe-il des avantages de performance ou d'autres raisons pour les mots clés, par opposition à des littéraux ou des spéciales du corps comme de l' None en python2?

45voto

devnull Points 45016

Peut-être parce que la version 2.6 de Python a permis non seulement True = False , mais a également permis de vous dire de drôles de choses comme:

__builtin__.True = False

qui serait réinitialiser True de False pour l'ensemble du processus. Elle peut conduire à vraiment de drôles de choses qui se passe:

>>> import __builtin__
>>> __builtin__.True = False
>>> True
False
>>> False
False
>>> __builtin__.False = True
>>> True
False
>>> False
False

EDIT: Comme l'a souligné Mike, le Python wiki indique également la suite sous la Base du changement de Langage:

  • Faire le Vrai et le Faux de mots clés.
    • Raison: faire cession impossible.

11voto

Kroltan Points 1165

Pour deux raisons, principalement:

  1. Donc, les gens ne font pas une farce __builtin__.True = False cachée sur un module aléatoire. (comme expliqué par devnull)
  2. Parce que les mots clés sont plus rapides que les intégrés globaux. Dans Python 2.x, l'interpréteur devrait résoudre les valeurs de ces variables avant de les utiliser, ce qui est un peu plus lent que les mots-clés. (voir Pourquoi si True est plus lent que si 1? )

3voto

chao787 Points 367

Cela a été discuté il y a quelques mois sur python-dev. Avoir des tonnes de liens vers la définition d'une réelle serait ennuyeux, contrairement à des liens, par exemple la non locaux ou avec des instructions doc.

Et des choses j'en conclus pourquoi le Vrai et le Faux va rendre les choses "encore plus fine".

  1. re-lié comme un effet secondaire de fonctions, appelée dans la boucle.

    Il est vraiment facile à modifier Vrai, telles que:

    def True(): imprimer Vrai

  2. Il n'y a vraiment pas de bonne façon de laisser l'utilisateur code de relier le haut-Aucun, True et False, faisant d'eux des mots-clés a quasiment que des avantages.

  3. Faire programme de recherche "Vrai" dans le symbole de table à chaque étape juste à trouver un Véritable a la valeur True est loin d'être intuitive. (c'est pourquoi 1 est plus rapide que de Vrai.)

    x=compile('tout en 1: foop()', ", 'exec')

    dis.dis(x)

          0 SETUP_LOOP              19 (to 22)
          3 JUMP_FORWARD             4 (to 10)
          6 JUMP_IF_FALSE           11 (to 20)
          9 POP_TOP
    >>   10 LOAD_NAME                0 (foop)
         13 CALL_FUNCTION            0
         16 POP_TOP
         17 JUMP_ABSOLUTE           10
    >>   20 POP_TOP
         21 POP_BLOCK
    >>   22 LOAD_CONST               1 (None)
         25 RETURN_VALUE
    

x=compile('while True: foop()', ", 'exec') dis.dis(x)

          0 SETUP_LOOP              19 (to 22)
    >>    3 LOAD_NAME                0 (True)
          6 JUMP_IF_FALSE           11 (to 20)
          9 POP_TOP
         10 LOAD_NAME                1 (foop)
         13 CALL_FUNCTION            0
         16 POP_TOP
         17 JUMP_ABSOLUTE            3
    >>   20 POP_TOP
         21 POP_BLOCK
    >>   22 LOAD_CONST               0 (None)
         25 RETURN_VALUE

référence:

Début parler liées à l'affectation, pour le Vrai et le Faux:

certains Aux Données:

PS: certains nombre montre la Véritable/1:

[alex@lancelot test]$ timeit.py -c -s'import itertools as it' 'c=it.count()'
'while True:' '  if c.next()>99: break'
10000 loops, best of 3: 91 usec per loop

[alex@lancelot test]$ timeit.py -c -s'import itertools as it' 'c=it.count()'
'while 1:' '  if c.next()>99: break'
10000 loops, best of 3: 76 usec per loop

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