"if x"和"if x not not"之间的区别

Goy*_*uix 37 python boolean

似乎"if x"对于较长的"if x is not None"语法几乎就像是短手.它们在功能上是否相同,或者在某些情况下,对于给定的x值,两者的评估方式不同?

我认为这些行为在Python实现中也应该是相同的 - 但如果存在细微差别,那么知道它会很棒.

sys*_*out 57

在以下情况中:

test = False 
test = "" 
test = 0
test = 0.0 
test = []
test = () 
test = {} 
test = set()
Run Code Online (Sandbox Code Playgroud)

if测试将有所不同:

if test: #False

if test is not None: #True 
Run Code Online (Sandbox Code Playgroud)

这是因为is测试身份,意义

test is not None
Run Code Online (Sandbox Code Playgroud)

相当于

id(test) == id(None) #False
Run Code Online (Sandbox Code Playgroud)

因此

(test is not None) is (id(test) != id(None)) #True
Run Code Online (Sandbox Code Playgroud)

  • 甚至更多.*所有*空集合和0当量(通常)是假的. (2认同)

Ign*_*ams 37

前者测试真实性,而后者测试身份None.值的很多都是假的,比如False,0,'',和None,但只能NoneNone.


edu*_*ffy 5

x = 0
if x: ...  # False
if x is not None: ... # True
Run Code Online (Sandbox Code Playgroud)


Ant*_*Ant 5

if x检查是否x被视为True

在Python中,一切都有一个布尔值(True/ False)。

被视为的值False

  • False,None
  • 0, 0.0,0j
  • [], (),{}
  • ''
  • 向 Python 发出信号表明它们为空的其他实例

其他值被视为True。例如,[False], ('hello'),'hello'被视为True(因为它们不为空)。

使用时if x is not None,您正在检查是否x不是None,但它可以是False或其他被视为的实例False

>>> x = None
>>> if not x:print x # bool(None) is False
None
>>> if x == None:print x
None
>>> x = False
>>> if not x:print x
False
>>> if x == None:print x
Run Code Online (Sandbox Code Playgroud)

最后,请注意TrueFalse分别等于10

>>> True + 1
2
>>> False + 1
1
>>> range(1, 5)[False]
1
Run Code Online (Sandbox Code Playgroud)