想知道if not foo is None
是否与if foo
相同?使用Python 2.7和foo
是一个字符串。
答案 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推荐的。
if a is None:
pass
如果if
已明确设置,True
将仅为a = None
。
另一方面:
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文档中的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
,但False
或None is None
除外。运营商something == None
has less precedence than comparisons(以及not
是比较运算符)因此is
与not 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