检查python 2.7中的字符串”none”或”not”

Check string “None” or “not” in Python 2.7

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


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

1
2
3
foo = ''
if foo:
    print 'if foo is True'

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

1
2
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中的一般原则:

1
2
if a is None:
    pass

如果明确设置了a = None,则if仅为True

另一方面:

1
2
if a:
    pass

当它是True时,有几种评估方法:

  • python尝试调用a.__bool__,如果实现了此方法,则使用返回值。

    • 因此,NoneFalse0.00将对False进行评估,因为它们的__bool__方法返回False
  • 如果没有执行a.__bool__,则检查a.__len__.__bool__返回的内容。

    • ''[]set()dict()等将对False进行评估,因为它们的__len__方法返回0。这是False,因为bool(0)False
  • 如果甚至没有执行a.__len__,那么如果只是返回True

    • 所以所有其他的对象/函数/任何东西都只是True
  • 另请参见:Python文档中的真值测试。


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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


    operator is比较id(您可以使用id(something)检查某个对象的id)。由于None只有一个实例,因此任何形式的something is None表示都将是FalseNone is Nonesomething == None除外。运算符not的优先级低于比较运算符(is是比较运算符),因此与not (string is None)相同的not string is None的结果始终是True

    然而,如果字符串对象不是空字符串,则认为它是True;如果字符串对象是空字符串,则认为它是False

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


    不,试试这个代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    foo=''
    if foo:
      print (1)
    else:
      print (2)
    if not foo is None:
      print (3)
    else:
      print (4)

    它会打印出来

    1
    2
    2
    3