想知道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
的方法:
Python 尝试调用
a.__bool__
如果实现了,则使用返回的值。- 所以
None
、False
、0.0
、0
的计算结果会False
,因为他们的__bool__
方法返回False
。
- 所以
如果未实现
a.__bool__
,则检查a.__len__.__bool__
返回的内容。-
''
、[]
、set()
、dict()
等的计算结果将False
,因为它们的__len__
方法返回0
。这很False
,因为bool(0)
False
.
-
如果连
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