首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“variable”或“variable is not None”

“variable”或“variable is not None”
EN

Stack Overflow用户
提问于 2013-03-27 13:23:59
回答 4查看 26.9K关注 0票数 15
代码语言:javascript
复制
Variable = None

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

代码语言:javascript
复制
if Variable:
 print "Hello world"

代码语言:javascript
复制
if Variable is not None:
 print "Hello world"

代码语言:javascript
复制
if Variable != None:
 print "Hello world"

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-27 13:56:19

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

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

第二个询问它是否是神奇的单例常量None。这只会对None本身失败。

第三个问题是,它是否认为自己等于None。比方说,对于Holder(None)来说,这将失败,因为Holder是一个包装类,它的实例与它们所持有的任何东西相比都是相等的。或者,给出一个不太现实但更简短的代码示例:

代码语言:javascript
复制
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践踏整个堆?),第一种方法更有可能仍然有效。但这些都不会有意义--而且,如果它们有关系,再一次,没有任何代码会更快、更可靠。

票数 11
EN

Stack Overflow用户

发布于 2013-03-27 13:25:49

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

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

编辑:

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

代码语言:javascript
复制
if not x:

为了检查是否提供了列表,则条件将在空列表上触发,该列表可能仍是有效输入。所以在这种情况下,你需要检查一下

代码语言:javascript
复制
if x is not None:

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

在某些语言中,None值可与nullnil值相媲美。它是已定义变量中缺少值的占位符(如果它是未定义的,它将抛出NameError)。这就是在某些情况下使用None值作为默认值的原因:

代码语言:javascript
复制
>>> def foo():
...     pass
...
>>> x = foo()
>>> x is None
True

它也经常用作可选变量的默认值:

代码语言:javascript
复制
>>> 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

票数 8
EN

Stack Overflow用户

发布于 2013-03-27 14:23:55

official PEP 8 recommendation将通过身份检查来测试是否为空:

代码语言:javascript
复制
if Variable is not None:
    print "Hello world"

相等性/不等性测试也会有效,但会更慢,而且不是惯用的:

代码语言:javascript
复制
if Variable != None:
    print "Hello world"

测试变量的布尔值会产生不同的结果。如果变量是一个空的容器或一个等于零的数字,下面的测试将输出"hello world“:

代码语言:javascript
复制
# Hello world won't print for any of these values:
for Variable in (), '', u'', {}, [], 0, 0.0, 0j, None:
    if Variable:
        print "Hello world"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15652427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档