34 votes

Pourquoi Python ne peut-il pas gérer les valeurs vraies / fausses comme je l'attends?

Dans le cadre de la réponse à une autre question, j'ai écrit le code suivant dont le comportement semble bizarre à première vue:

 print True                    # outputs true
True = False;    print True   # outputs false
True = True;     print True   # outputs false
True = not True; print True   # outputs true
 

Quelqu'un peut-il expliquer ce comportement étrange? Je pense que cela a quelque chose à voir avec le modèle objet de Python mais je ne suis pas sûr.

C'est la version 2.5.2 sous Cygwin.

77voto

balpha Points 18387

Python a ces deux (entre autres) builtin objets. Ils sont juste des objets; au début, ils n'ont pas de noms, mais de savoir ce que nous appelons, appelons - 0x600D et 0xBAD.

Avant de commencer à exécuter un Python (2.x) script, le nom de l' True obtient lié à l'objet 0x600D, et le nom de l' False obtient lié à l'objet 0xBAD, de sorte que lorsque le programme se réfère à l' True, il regarde 0x600D.

Parce qu' 0x600D et 0xBAD savent qu'ils sont généralement utilisés par les noms True et False, c'est ce qu'ils sortie lorsqu'ils sont imprimés, à savoir l' __str__ méthode de 0x600D retours 'True' et ainsi de suite.

True = False

lie aujourd'hui le nom d' True à un autre objet. À partir de maintenant, les deux noms True et False font référence au même objet 0xBAD, ce qui, une fois imprimées, les sorties False.

True = True

ne pas vraiment faire quelque chose: Il faut de l'objet référencé par le nom de l' True, et lie les nouveaux (et anciens) nom True de cet objet. Depuis (en raison de l'étape précédente) True désigne 0xBAD avant cela, il fait toujours référence à l' 0xBAD après ce. Par conséquent, l'impression encore sorties False.

True = not True

d'abord l'objet que le nom de l' True est lié à, qui est - 0xBAD. Il donne à cet objet à l' not de l'opérateur. not n'a pas de soins (ou de savoir) ce nom est utilisé ici pour désigner 0xBAD, il sait juste que lorsqu' 0xBAD il devrait revenir en 0x600D. Cette valeur de retour est alors donné à l'opérateur d'assignation =, contraignant le nom True de cet objet.

Depuis le nom True maintenant une fois de plus fait référence à l'objet 0x600D, appelant print True sorties True, et le monde est bon à nouveau.

45voto

James Points 5137

Imaginez ceci à la place:

 A = True
B = False

print A           # true
A = B;  print A   # false
A = A;  print A   # false, because A is still false from before
A = not A; print A # true, because A was false, so not A is true
 

La même chose se passe exactement, mais dans votre version, c'est déroutant, car vous ne vous attendez pas à pouvoir redéfinir Vrai et Faux.

18voto

Dans 2.x, True et False ne sont pas des mots clés, il est donc possible de masquer les éléments intégrés de cette manière.

12voto

ghostdog74 Points 86060

Vous pouvez vérifier si True / False est un mot-clé:

 >>> import keyword
>>> keyword.iskeyword('True')
False
 

Comme ce n'est pas le cas (dans ma version), attribuer True = False signifie simplement que "True" est un autre nom "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