关于python:’变量’或’变量不是无’

'variable' or 'variable is not None'

本问题已经有最佳答案,请猛点这里访问。
1
Variable = None

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

1
2
if Variable:
 print"Hello world"

1
2
if Variable is not None:
 print"Hello world"

1
2
if Variable != None:
 print"Hello world"

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


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

第一问是什么falsy是否可变。这个测试将失败的所有事物的种类None- False0,此外,任何空序列,等等。

第二个要求是它的神奇None单身等。这将仅用于None本身的失败。

第三问,这是什么东西None等于认为本身。这将失败的话,说,在HolderHolder(None),其包装类的实例是一个比较平等,任何他们再到控股公司。或不现实的,但对你exmaple:短码

1
2
3
4
class Stupid(object):
    def __ne__(self, other):
        return False
Variable = Stupid()

最后一个是有用的,在极少;事实上,如果你不认为你可能需要检查或!= None== None,你已经创建了T,或透明的包装类的东西你真的想这样,可能is not Noneis None或。但其他两个是非常有用的和通用的。

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

嗯,有一个更差的是合适的,它取决于在特定的使用。

在结束的时候,似乎有可能是什么样,你要在任何特定的情况下,差分VariableNone是绝对的。在这一案例中,当然,有一种之间的差异的功能。*所有的都是有保证的,因此是不假。它也有一个均值之间的差异,在任何的三个与写作中的所有代码。这是一simpler地段,更可读的,和更快的。

*有一个表演的第一个差分LOAD_CONST不是必须的None呼叫,或比较操作。和,即使你不知道怎rebind托管到None或变化的常数的值(可能由几None全堆在与ctypes?)第一,更多的可能是一个好的工作。但这是不可不去的,如果在所有,在我们的代码,甚至会更快和更可靠的。


如果是真的not xxNoneFalse[]{},,,,等。

x is not None将永远是True,除非是真的None可变。

编辑:

这一实践的重要性时,你要检查,如果变量是真集到适当的值。你可以跑不成问题。例如,如果你要来评价项目的列表:

1
if not x:

如果该列表是提供给检查的条件,然后将触发在一个空的列表,还可以是一个有效的输入。这是操作系统中的案例,你喜欢与D检查

1
if x is not None:

允许空输入列表的有效性的检查,但仍然是在所有的情况下,提供的列表。

在这样的值是可比的None到一定值或nilnull语言。它的placeholder缺乏价值的定义中的变量(如果它是没有定义的,它将投掷NameError)。这就是为什么在None默认值的值是用在一些案例:

1
2
3
4
5
6
>>> def foo():
...     pass
...
>>> x = foo()
>>> x is None
True

它也经常被使用的变量的默认值是可选的。

1
2
3
4
5
6
7
8
9
10
>>> 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仍然是有效的评估值,这将Falseif not bar:如果检查到。


官方的建议是,PEP 8不安的身份检查和测试:

1
2
if Variable is not None:
    print"Hello world"

不等式的等式/测试还将工作,但将是慢的和非idiomatic:

1
2
if Variable != None:
    print"Hello world"

布尔变量的测试值的produces不同的结果。下面的测试将打印"Hello World"为一个空的容器,如果变量或数等于零:

1
2
3
4
# Hello world won't print for any of these values:
for Variable in (), '', u'', {}, [], 0, 0.0, 0j, None:
    if Variable:
        print"Hello world"

他们是不同的。如果bool(var)evaluates Falsenot检查到。

EG。

1
2
3
4
5
6
>>> not ''
True
>>> not 'abc'
False
>>> not 0
True

如果x是一if x is None检查None本身。