Variable = None在特定场景下,这三者之间有什么区别吗?如果没有区别,哪一个更适合使用呢?
if Variable:
print "Hello world"和
if Variable is not None:
print "Hello world"和
if Variable != None:
print "Hello world"在没有变量的情况下是否相同?
发布于 2013-03-27 13:56:19
在特定场景下,这三者之间有什么区别吗?
第一个问题是询问变量是否有任何错误。除了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践踏整个堆?),第一种方法更有可能仍然有效。但这些都不会有意义--而且,如果它们有关系,再一次,没有任何代码会更快、更可靠。
发布于 2013-03-27 13:25:49
如果x为None、False、[]、{}等,则not x将为真。
除非变量实际为True,否则x is not None将始终为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仍然是一个有效值,如果用if not bar:检查,它的计算结果将为False。
发布于 2013-03-27 14:23:55
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"https://stackoverflow.com/questions/15652427
复制相似问题