2010-10-10 5 views
24

Похоже, что «если x» почти похоже на короткую руку для более сильного синтаксиса «если x не является None». Являются ли они функционально идентичными или существуют случаи, когда при заданном значении x два будут оцениваться по-разному?Разница между «if x» и «if x is not None»

Я бы предположил, что поведение должно также быть идентичным в реализации Python, но если есть тонкие различия, было бы замечательно знать.

ответ

40

В следующих случаях:

test = False 
test = "" 
test = 0 
test = 0.0 
test = [] 
test =() 
test = {} 
test = set() 

тест if будет отличаться:

if test: #False 

if test is not None: #True 

Это тот случай, потому что is тесты для идентичности, а это означает

test is not None 

эквивалентно

id(test) == id(None) #False 

поэтому

(test is not None) is (id(test) != id(None)) #True 
+2

И даже больше. * Все * пустые коллекции и 0-эквиваленты являются (обычно) ложными. – delnan

+1

collections.deque, collections.defaultdict, collections.namedtuple, collections.OrderedDict ... тоже что-нибудь с магическими методами '__bool__' или' __nonzero__', возвращающими false. – Autoplectic

+1

и развернуть на 0-эквиваленты: Десятичный (0), 0 + 0j, 0.0 и т. Д. Все оцениваются как false. – Autoplectic

33

Бывший испытывает истинность, тогда как последний проверяет идентичность с None. Множество значений ложно, например False, 0, '' и None, но только None - None.

1

все в питон имеет булево значение. значения не являются True, False, None

все истинно или ложно

0 Ложное

[],(), {}, '' ложны (все пусто)

[Ложная], ('привет'), 'привет', и т.д., True (потому что не являются пустыми)

только никто не None ..

>>> x = None 
>>> if not x:print x #because bool(None) is False 

None 
>>> if x == None:print x 

None 
>>> x = False 
>>> if not x:print x 

False 
>>> if x == None:print x 

>>> 

наконец, обратите внимание, что истина и ложь «особую» версию 1 и 0 ... , например

>>>True + 1 
2 
>>>False + 1 
1 
>>>range(1, 5)[False] 
1 
1
if x: 
    # Evaluates for any defined non-False value of x 
if not x: 
    # Evaluates for any defined False value of x 
if x is None: 
    # Evaluates for any instances of None 

Нет является его собственный тип, который оказывается ложным. «if not x» оценивает, если x = None, только потому, что None является False.

Нет никаких тонких различий, которые я знаю, но существуют точные методы для проверки положительности/отрицательности в точных ситуациях. Смешение их может работать в некоторых ситуациях, но может привести к проблемам, если они не поняты.

if x is True: 
    # Use for checking for literal instances of True 
if x is False: 
    # Use for checking for literal instances of False 
if x is None: 
    # Use for checking for literal instances of None 
if x: 
    # Use for checking for non-negative values 
if not x: 
    # Use for checking for negative values 
    # 0, "", None, False, [],(), {} are negative, all others are True 
Смежные вопросы