'变量'或'变量不是无'

时间:2013-03-27 05:23:59

标签: python comparison

Variable = None

在特定情况下,这三者之间是否存在差异?如果没有哪个更适合使用?

if Variable:
 print "Hello world"

if Variable is not None:
 print "Hello world"

if Variable != None:
 print "Hello world"
无变量的情况下

是相同的吗?

4 个答案:

答案 0 :(得分:10)

  

在特定情况下,这三者之间是否存在差异?

第一个询问变量是否是虚假的。除了None - False0,任何空序列等之外,此测试都会失败。

第二个问是否是魔法单身常数None。这只会导致None本身失败。

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

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

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

  

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

嗯, 是一个区别,哪一个更合适取决于具体用途。

在问题的最后,您可能会问到Variable绝对是None的特定情况是否存在任何差异。在这种情况下,当然三者之间没有功能差异。*所有这些都保证是假的,因此什么都不做。这意味着三者中的任何一个都没有区别,也没有任何代码。这更简单,更易读,更快。

*存在性能差异 - 第一个不需要LOAD_CONST None,或者调用比较运算符。并且,即使您以某种方式设法重新绑定None或更改None常量的值(可能是通过使用ctypes在整个堆中踩踏?),第一个更多可能仍然有效。但这些都不重要 - 如果他们再这样做,那么根本就没有代码会更快,更可靠。

答案 1 :(得分:7)

如果not xxNoneFalse[]等,

{}将为真。

x is not None始终为True,除非变量实际为None

编辑:

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

if not x:

检查是否提供了列表,然后条件将在空列表上触发,该列表可能仍然是有效输入。那么在这种情况下,您需要查看

if x is not None:

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

None值与某些语言中的nullnil值相当。它是一个占位符,表示缺少定义变量中的值(如果未定义,则会抛出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