“variable”或“variable is not None”

2024-09-30 03:25:03 发布

您现在位置:Python中文网/ 问答频道 /正文

Variable = None

在特定的场景中,这三者之间有什么区别吗?如果没有区别,哪一个更适合使用?

if Variable:
 print "Hello world"

以及

if Variable is not None:
 print "Hello world"

以及

if Variable != None:
 print "Hello world"

在没有变量的情况下是相同的吗?


Tags: nonehelloworldifis场景not情况
3条回答

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

除非变量实际上是None,否则x is not None将始终是True

编辑:

这一点非常重要,只要您想检查变量是否实际设置为正确的值。否则你会遇到麻烦。例如,如果要计算项目列表并执行以下操作:

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

Is there any difference between these three in a specific scenario ?

第一个问题是变量是否有错误。除了None-False0和任何空序列等,此测试将失败

第二个问题是它是否是神奇的单重常数None。这只会对None本身失败。

第三个问题是它是否认为自己等于None。这将失败,比如说,Holder(None),其中Holder是一个包装类,其实例与它们所持有的内容进行比较。或者,给出一个不太现实但代码更短的exmaple:

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

最后一个是很少有用的;事实上,如果您认为可能需要检查== None!= None,并且您没有专门创建透明包装类或类似的类,那么您可能实际上需要is Noneis not None。但另外两个都是非常有用和常见的。

if there is no difference which one is more suitable to use?

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

在问题的最后,您可能会问,在Variable肯定是None的特定情况下,是否存在任何差异。在这种情况下,三者之间当然没有功能上的区别,*它们都保证是错误的,因此什么也不做。这意味着这三种方法中的任何一种都和不写代码没有区别。更简单,可读性更强,速度更快。

*有一个性能差异第一个不需要LOAD_CONSTNone,也不需要调用比较运算符。而且,即使您以某种方式重新绑定了None或更改了None常量的值(可能是用ctypes在堆中到处跺脚?),第一个更可能仍然有效。但这两种方法都不重要,如果它们真的重要,那么任何代码都不会更快、更可靠。

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"

相关问题 更多 >

    热门问题