16
Variable = None

在特定情况下,这三者之间有什么区别吗?如果没有区别,哪个更适合使用?

if Variable:
 print "Hello world"

if Variable is not None:
 print "Hello world"

if Variable != None:
 print "Hello world"

在无变量的情况下是否相同?

4

4 回答 4

11

在特定情况下,这三者之间有什么区别吗?

第一个询问变量是否是虚假的。None除了-<code>False, 0, 任何空序列等之外,此测试将失败。

第二个询问是否是魔术单例常量None。这只会为None自己失败。

第三个询问是否有任何东西认为自己等于None。例如,这将失败Holder(None),其中Holder是一个包装器类,其实例比较等于它们所持有的任何东西。或者,给出一个不太现实但更短的代码示例:

class Stupid(object):
    def __ne__(self, other):
        return False
Variable = Stupid()

最后一个很少有用;事实上,如果你认为你可能需要检查== Noneor != None,并且你没有专门创建透明包装类或类似的东西,你可能真的想要is Noneor is not None。但其他两个都非常有用和常见。

如果没有区别,哪个更适合使用?

嗯,还是有区别的,看具体用途,哪个更合适。

在问题的最后,您似乎可能会问在 where Variableis absolute的特定情况下是否有任何区别None。在那种情况下,这三者之间当然没有功能上的区别。*它们都保证为假,因此什么也不做。这意味着这三者中的任何一个与根本不编写代码之间也没有区别。这更简单,更易读,更快。

* 存在性能差异——第一个不必LOAD_CONST使用None, 或调用比较运算符。而且,即使您以某种方式设法重新绑定None或更改了None常量的值(可能是通过在整个堆上踩ctypes?),第一个更有可能仍然有效。但这些都无关紧要——而且,如果他们这样做,再一次,没有任何代码会更快、更可靠。

于 2013-03-27T05:56:18.657 回答
8

not x如果xis None, False, [], {}, 等则为真。

x is not None将永远是True,除非变量实际上是None

编辑:

当您想检查变量是否实际设置为正确值时,这具有实际重要性。否则你可能会遇到问题。例如,如果您想评估项目列表并执行以下操作:

if not x:

检查是否提供了一个列表,然后条件将在一个空列表上触发,这可能仍然是一个有效的输入。所以在这种情况下,你想检查

if x is not None:

允许空列表作为有效输入,但仍然检查根本没有提供列表的情况。

None值本身与某些语言中的 anull或值相当。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:.

于 2013-03-27T05:25:49.290 回答
5

PEP 8的官方建议是通过身份检查来测试None :

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"
于 2013-03-27T06:23:55.010 回答
2

它们不一样。not检查是否bool(var)评估为False.

例如。

>>> not ''
True
>>> not 'abc'
False
>>> not 0
True

if x is None检查 x 是否是None它自己。

于 2013-03-27T05:26:03.650 回答