2011-06-29 10 views
11

Natknąłem się na to, gdzie "nie ma nikogo" jest równe jednocześnie Prawdziwej, jak i Fałszy.Logiczny paradoks w python?

>>> not None 
True 

>>> not None == True 
True 

>>> not None == False 
True 

Początkowo spodziewałem się, że będzie to z powodu kolejności operatorów, ale jednak przy testowaniu podobną zależność:

>>> not False 
True 

>>> not False == False 
False 

>>> not False == True 
True 

może ktoś wyjaśnić dlaczego tak się dzieje?

+0

Znalazłem [tę stronę] (http://docs.python.org/reference/expressions.html#summary) bardzo przydatne –

Odpowiedz

21

Ten jest ze względu na pierwszeństwo operatora. not none == True oznacza not (None == True) oznacza not (None == True) oznacza None != True, co jest prawdziwe. Podobnie jest również None != False. Wartość None różni się od wartości logicznych.

Twoje ostatnie dwa wyrażenia oznaczają False != False, który jest fałszywy, a False != True, który jest prawdziwy.

+1

Świetnie! Więc mój błąd nie był do wykonania _ (nie None) == True_? –

+7

@Dog eat cat world: yes. Ale pamiętaj, że '(nie None) == True' jest prawdziwe, natomiast' (nie True) == None' jest fałszywe, ponieważ 'None! = False'. Aby przekonwertować wartość, która może być "None" na wartość logiczną, wywołaj na niej 'bool'. –

4

Jest to w rzeczy samej spowodowane priorytetem operatora. not None == False zostanie oceniony jako not (None == False). None == False to False, który wyjaśnia twoje wyniki.

Spróbuj to zamiast:

>>> (not None) == True 
True 
>>> (not None) == False 
False 
2
>>> not None 
True 
>>> not None == True 
True 
>>> not None == False 
True 
>>> (not None) == True 
True 
>>> (not None) == False 
False 
2

Jest kolejność ekspansji. python czyta je w ten sposób:

o>>> not (None == True) 
True 
>>> not (None == False) 
True 
>>> not False 
True 
>>> not (False == False) 
False 
>>> not (False == True) 
True 
>>> 

Myślę, że to wyjaśnia.

Powiązane problemy