检查 Python 2.7 中的字符串"None"或"not"



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

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

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

仅当显式设置a = None if时,才会True

另一方面:

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.

另请参阅:Python 文档中的真实值测试。

不,当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

运算符is比较 id(您可以使用 id(something) 检查某些内容的 id)。因为None只有一个实例,任何形式为something is None的表达式都将被False,除了None is None或如果something == None。运算符 not 的优先级低于比较运算符(is 是比较运算符),因此与 not (string is None) 相同的 not string is None 的结果始终True

但是,如果字符串对象不是空字符串,则认为它是True对象,如果它是空字符串,则被视为False

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

No. 试试这个代码

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

它将打印

2
3

最新更新