Разница между "if x" и "if x is not None"
Похоже, что "если x" почти похоже на короткую руку для более сильного синтаксиса "if x is not None". Являются ли они функционально идентичными или существуют случаи, когда для заданного значения x эти два будут оцениваться по-разному?
Я бы предположил, что поведение должно также быть идентичным в реализациях Python, но если есть тонкие различия, было бы замечательно знать.
Ответы
Ответ 1
В следующих случаях:
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
Первая тестирует истинность, тогда как последняя проверяет идентичность с None
. Множество значений ложно, например False
, 0
, ''
и None
, но только None
равно None
.
Ответ 3
x = 0
if x: ... # False
if x is not None: ... # True
Ответ 4
все в python имеет значение bool.
значения True, False, None
все верно или ложно
0 - False
[],(), {}, '' являются ложными (все пусто)
[False], ('hello'), 'hello' и т.д. True (причина не пустая)
Только None 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
>>>
наконец, обратите внимание, что True и False являются "специальными" версиями 1 и 0...
например
>>>True + 1
2
>>>False + 1
1
>>>range(1, 5)[False]
1
Ответ 5
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 is 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