2013-07-19 4 views
6

Après quelques essais et erreurs après la publication this question, j'observe les phénomènes suivants:Liste Python - Vrai/Faux deux premiers éléments?

>>> [1,2][True] 
2 
>>>>[1,2][False] 
1 
>>>>[1,2,3][True] 
2 

Si j'ajoute un troisième élément ou après, il n'a pas d'effet. Est-ce que quelqu'un peut me diriger vers l'explication de ces observations? Je présume que c'est une propriété générale relative aux deux premiers éléments de n'importe quelle liste Python?

Merci

Répondre

12

Ce qui se passe ici est un peu déroutant, car [1,2,3][True] a deux ensembles de [] s qui sont interprétés de différentes façons.

Ce qui se passe est un peu plus clair si nous divisons le code sur quelques lignes.

Le premier ensemble de [] s construit un objet liste. Assignons cet objet le nom a:

>>> [1,2,3] 
[1, 2, 3] 
>>> a = [1,2,3] 
>>> 

Le deuxième ensemble de [] spécifier un index dans cette liste. Vous souhaitez généralement voir le code comme ceci:

>>> a[0] 
1 
>>> a[1] 
2 
>>> 

Mais il est tout aussi valide pour utiliser l'objet liste directement, sans jamais lui donner un nom:

>>> [1,2,3][0] 
1 
>>> [1,2,3][1] 
2 

Enfin, le fait que True et False sont utilisables en tant qu'index parce qu'ils sont traités comme des entiers. De l'data model docs:

Il existe trois types d'entiers:

entiers simples ....

entiers longs .....

booléens

Ceux-ci représentent la vérité des valeurs Faux et vrai. Les deux objets représentant les valeurs False et True sont les seuls objets booléens . Le type booléen est un sous-type d'entiers simples et les valeurs booléennes se comportent comme les valeurs 0 et 1, respectivement, dans presque tous les contextes , l'exception étant que lors de la conversion en chaîne, les chaînes "False" ou "True" sont retournés, respectivement.

Ainsi, [1,2,3][True] est équivalent à [1,2,3][1]

+1

Excellente explication, merci. – Pyderman

27

Parce que:

>>> True == 1 
True 
>>> False == 0 
True 

booléenne est une sous-classe de int. Il est sûr * de dire que True == 1 et False == 0. Ainsi, votre code est identique à:

>>> [1, 2][1] 
2 
>>> [1, 2][0] 
1 
>>> [1, 2, 3][1] 
2 

C'est pourquoi lorsque vous ajoutez d'autres éléments, la sortie reste la même. Cela n'a rien à voir avec la longueur de la liste, car ce n'est qu'une indexation de base qui n'affecte que les deux premières valeurs.


*: NB: True et False peut effectivement être overritten en Python < = 2.7. Observer:

>>> True = 4 
>>> False = 5 
>>> print True 
4 
>>> print False 
5 

*: Cependant, depuis Python 3, True et False sont les mots clés maintenant. Essayer de reproduire le code ci-dessus retournera:

>>> True = 4 
    File "<stdin>", line 1 
SyntaxError: assignment to keyword 
+0

Ah, bien sûr. Merci Monsieur. – Pyderman

Questions connexes