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

NIl*_*rma 12 python comparison

Variable = None
Run Code Online (Sandbox Code Playgroud)

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

if Variable:
 print "Hello world"
Run Code Online (Sandbox Code Playgroud)

if Variable is not None:
 print "Hello world"
Run Code Online (Sandbox Code Playgroud)

if Variable != None:
 print "Hello world"
Run Code Online (Sandbox Code Playgroud)

无变量的情况是一样的吗?

aba*_*ert 10

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

第一个询问变量是否是任何虚假的.对于除了None- ,任何空序列等之外的所有事情False,此测试都将失败0.

第二个问是否是魔法单身常数None.这只会为None自己失败.

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

class Stupid(object):
    def __ne__(self, other):
        return False
Variable = Stupid()
Run Code Online (Sandbox Code Playgroud)

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

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

嗯,有有差别,哪一个更适合取决于特定的用途.

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

*有一个性能差的第一个不具有LOAD_CONSTNone,或者叫一个比较操作.并且,即使你以某种方式设法重新绑定None或更改None常量的值(可能是通过在堆上捣乱ctypes?),第一个更有可能仍然有效.但这些都不重要 - 如果他们再这样做,那么根本没有任何代码会更快,更可靠.


Stj*_*rac 7

not x如果为真xNone,False,[],{},等.

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

编辑:

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

if not x:
Run Code Online (Sandbox Code Playgroud)

要检查是否提供了列表,那么条件将在空列表上触发,该列表可能仍然是有效输入.那么在这种情况下,你想查一下

if x is not None:
Run Code Online (Sandbox Code Playgroud)

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

None作为这样的值是可比的nullnil在某些语言中值.它是一个占位符,缺少定义变量中的值(如果它未定义,则会抛出一个NameError).这就是None在某些情况下将该值用作默认值的原因:

>>> def foo():
...     pass
...
>>> x = foo()
>>> x is None
True
Run Code Online (Sandbox Code Playgroud)

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

>>> 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.
Run Code Online (Sandbox Code Playgroud)

这样,0仍然是一个有效值,False如果选中,则评估为if not bar:.


Ray*_*ger 5

官员PEP 8的建议是测试与身份检查:

if Variable is not None:
    print "Hello world"
Run Code Online (Sandbox Code Playgroud)

相等/不等式测试也可以使用,但速度较慢且不符合习惯:

if Variable != None:
    print "Hello world"
Run Code Online (Sandbox Code Playgroud)

测试变量的布尔值会产生不同的结果。如果变量是空容器或等于零的数字,则以下测试将打印“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"
Run Code Online (Sandbox Code Playgroud)