在Python 2.7中检查字符串“None”或“not”

时间:2016-03-12 00:31:35

标签: python string python-2.7

想知道if not foo is None是否与if foo相同?使用Python 2.7和foo是一个字符串。

4 个答案:

答案 0 :(得分:8)

对于空字符串,两者都不同:

foo = ''
if foo:
    print 'if foo is True'

不会打印任何内容,因为它为空因此被视为False但是:

if foo is not None: 
    print 'if not foo is None is True'

将打印,因为foo 不是

我根据PEP8更改了它。 if foo is not None相当于您的if not foo is None,但更具可读性,因此也是PEP8推荐的。

更多关于Python中的一般原则:

if a is None:
    pass

如果if已明确设置,True将仅为a = None

另一方面:

if a:
    pass

有几种评估时间True的方式:

  1. Python尝试调用a.__bool__,如果已实现,则使用返回的值。

    • 所以NoneFalse0.00会评估为False,因为他们的__bool__方法会返回False
  2. 如果未a.__bool__未实施,则会检查a.__len__.__bool__返回的内容。

    • ''[]set()dict()等将评估为False,因为他们的__len__方法会返回0 }。哪个是False,因为bool(0)False
  3. 如果没有实现a.__len__,那么只返回True

    • 所以其他所有对象/功能/其他只是True
  4. 另见:python文档中的truth-value-testing

答案 1 :(得分:5)

不,当foo是空字符串时不一样。

In [1]: foo = ''

In [2]: if foo:
   ...:     print 1
   ...:

In [3]: if foo is None:
   ...:     print 2
   ...:

In [4]: if not foo is None:
   ...:     print 3
   ...:
3

答案 2 :(得分:3)

运营商char会比较ID(您可以使用is检查某些内容的ID)。由于只有id(something)的一个实例,None形式的任何表达式都将为something is None,但FalseNone is None除外。运营商something == None has less precedence than comparisons(以及not是比较运算符)因此isnot string is None相同的结果始终为{{1 }}

然而,如果字符串对象不是空字符串,则将其视为not (string is None);如果是空字符串,则将其视为True

因此,其中一个表达式总是True而另一个表达式可以变化,所以不是,它们不等同。

答案 3 :(得分:2)

没有。试试这段代码

foo=''
if foo:
  print (1)
else:
  print (2)
if not foo is None:
  print (3)
else:
  print (4)

它会打印

2
3