【问题标题】:'variable' or 'variable is not None' [duplicate]“变量”或“变量不是无”[重复]
【发布时间】:2013-03-17 03:43:06
【问题描述】:
Variable = None

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

if Variable:
 print "Hello world"

if Variable is not None:
 print "Hello world"

if Variable != None:
 print "Hello world"

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

【问题讨论】:

标签: python comparison


【解决方案1】:

如果xNoneFalse[]{} 等,not x 将为真。

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 仍然是一个有效值,如果使用if not bar: 进行检查,则其计算结果为False

【讨论】:

  • 措辞挑剔:如果没有定义变量,if x is not None 仍然是NameError,就像if not x。 (您可能想描述某种默认为None 的上下文,以便以一种简单而又不误导的方式更容易地解释这一点?)
  • 谢谢,编辑了答案。
【解决方案2】:

它们是不同的。 not 检查 bool(var) 的计算结果是否为 False

例如。

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

if x is None 检查 x 是否为 None 本身。

【讨论】:

    【解决方案3】:

    这三者在特定场景下有什么区别吗?

    第一个询问变量是否是虚假的。除了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_CONSTNone,或调用比较运算符。而且,即使您以某种方式设法重新绑定None 或更改None 常量的值(可能是用ctypes 踩遍整个堆?),第一个更有可能仍然有效。但这些都无关紧要——而且,如果他们这样做了,再一次,没有任何代码会更快、更可靠。

    【讨论】:

      【解决方案4】:

      official PEP 8 recommendation 用于通过身份检查来测试 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"
      

      【讨论】:

        猜你喜欢
        • 2012-06-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 2013-03-28
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多