2013-07-19 16 views
6

po kilka prób i błędów po zaksięgowaniu this question, I przestrzegać następujących zjawisk:Python list - Prawda/Fałsz pierwsze dwa elementy?

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

Jeśli dodać trzeciego lub kolejnego elementu, to nie ma znaczenia.

Czy ktoś może wskazać mi wyjaśnienie tych obserwacji? Zakładam, że jest to pewna ogólna właściwość odnosząca się do pierwszych dwóch elementów na dowolnej liście Pythona?

Dzięki

Odpowiedz

12

Co się dzieje tutaj jest trochę mylące, ponieważ [1,2,3][True] ma dwa zestawy [] s, które są interpretowane na różne sposoby.

To, co się dzieje, jest nieco bardziej jasne, jeśli podzielimy kod na kilka linii.

Pierwszy zestaw [] s tworzy obiekt listy. Załóżmy, że przypisywanie obiektów nazwą a:

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

Drugi zestaw [] określić indeks wewnątrz tej listy. Zwykle chcesz zobaczyć kod tak:

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

Ale to jest tak samo ważne, aby użyć obiektu listy bezpośrednio, nigdy nie dając mu nazwę:

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

Wreszcie fakt, że True i False są użyteczne jako indeksy, ponieważ są traktowane jako liczby całkowite. Z data model docs:

Istnieją trzy typy liczb całkowitych:

Plain liczby całkowite ....

długie liczby całkowite .....

Boolean

Reprezentują one prawdą wartości Fałsz i Prawda. Dwa obiekty reprezentujące wartości False i True są jedynymi obiektami typu Boolean . Typ Boolean jest podtypem zwykłych liczb całkowitych, a wartości Boolean zachowują się odpowiednio jak wartości 0 i 1 w prawie wszystkich kontekstach , z wyjątkiem tego, że po przekonwertowaniu na ciąg znaków, ciągi "False" lub "True" mają wartość . są zwracane, odpowiednio.

Zatem [1,2,3][True] odpowiada [1,2,3][1]

+1

Doskonałe wyjaśnienie, dziękuję. – Pyderman

27

Ponieważ:

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

Boolean jest podklasą int. Można bezpiecznie * powiedzieć, że są to: True == 1 i False == 0. W związku z tym Twój kod jest identyczny z:

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

Dlatego, gdy dodasz więcej elementów, wynik pozostanie taki sam. Nie ma nic wspólnego z długością listy, ponieważ jest to tylko podstawowe indeksowanie wpływające tylko na pierwsze dwie wartości.


*: NB: True i False można rzeczywiście overritten w Pythonie < = 2,7. Przestrzegać:

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

*: Jednakże, ponieważ Python 3, Prawda i fałsz są teraz słów kluczowych. Próbując odtworzyć powyższy kod zwróci:

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

Ah, oczywiście. Dziękuję Panu. – Pyderman