Variable = None
在特定情况下,这三者之间是否存在差异?如果没有哪个更适合使用?
if Variable:
print "Hello world"
和
if Variable is not None:
print "Hello world"
和
if Variable != None:
print "Hello world"
无变量的情况下是相同的吗?
答案 0 :(得分:10)
在特定情况下,这三者之间是否存在差异?
第一个询问变量是否是虚假的。除了None
- False
,0
,任何空序列等之外,此测试都会失败。
第二个问是否是魔法单身常数None
。这只会导致None
本身失败。
第三个询问是否认为自己等于None
。例如,Holder(None)
,这将失败,其中Holder
是一个包装类,其实例比较等于它们持有的任何内容。或者,为了给代码例子提供一个不太现实但更短的代码:
class Stupid(object):
def __ne__(self, other):
return False
Variable = Stupid()
最后一个很少有用;事实上,如果你认为你可能需要检查== None
或!= None
,并且你没有专门创建透明包装类或类似的东西,你可能真的想要is None
或is not None
。但其他两个都非常有用和普遍。
如果哪一个更适合使用没有区别?
嗯, 是一个区别,哪一个更合适取决于具体用途。
在问题的最后,您可能会问到Variable
绝对是None
的特定情况是否存在任何差异。在这种情况下,当然三者之间没有功能差异。*所有这些都保证是假的,因此什么都不做。这意味着三者中的任何一个都没有区别,也没有任何代码。这更简单,更易读,更快。
*存在性能差异 - 第一个不需要LOAD_CONST
None
,或者调用比较运算符。并且,即使您以某种方式设法重新绑定None
或更改None
常量的值(可能是通过使用ctypes
在整个堆中踩踏?),第一个更多可能仍然有效。但这些都不重要 - 如果他们再这样做,那么根本就没有代码会更快,更可靠。
答案 1 :(得分:7)
not x
为x
,None
,False
,[]
等, {}
将为真。
x is not None
始终为True
,除非变量实际为None
。
编辑:
当您想要检查变量是否实际设置为正确值时,这具有实际意义。否则你可能会遇到问题。例如,如果要评估项目列表并执行:
if not x:
检查是否提供了列表,然后条件将在空列表上触发,该列表可能仍然是有效输入。那么在这种情况下,您需要查看
if x is not None:
允许空列表作为有效输入,但仍检查没有提供任何列表的情况。
此None
值与某些语言中的null
或nil
值相当。它是一个占位符,表示缺少定义变量中的值(如果未定义,则会抛出NameError
)。这就是None
值在某些情况下用作默认值的原因:
>>> def foo():
... pass
...
>>> x = foo()
>>> x is None
True
它也经常用作可选变量的默认值:
>>> def foo(bar=None):
... if bar is None:
... print('No argument passed.')
... else:
... print('Variable bar: %s' % str(bar))
...
>>> foo(0)
Variable bar: 0
>>> foo()
No argument passed.
这样,0
仍然是有效值,如果使用False
进行检查,则评估为if not bar:
。
答案 2 :(得分:4)
official PEP 8 recommendation是使用身份检查来测试无:
if Variable is not None:
print "Hello world"
平等/不平等测试也会起作用,但速度较慢且不具有惯用性:
if Variable != None:
print "Hello world"
测试变量的布尔值会产生不同的结果。以下测试将打印" hello world"如果变量是空容器或数字等于零:
# Hello world won't print for any of these values:
for Variable in (), '', u'', {}, [], 0, 0.0, 0j, None:
if Variable:
print "Hello world"
答案 3 :(得分:2)
他们是不同的。 not
检查bool(var)
是否评估为False
。
例如
>>> not ''
True
>>> not 'abc'
False
>>> not 0
True
if x is None
检查x本身是否为None
。