您是否想知道if not foo is None
与if foo
是否相同?使用Python 2.7,foo
是一个字符串。
您是否想知道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
不是 None,所以会打印出来!
我根据 PEP8 进行了修改。 if foo is not None
等同于你的 if not foo is None
但更易读,因此被 PEP8 推荐。
if a is None:
pass
if
只有在明确设置了 a = None
的情况下才会为 True
。if a:
pass
有几种方法可用于评估Python中语句的真实性:
Python尝试调用 a.__bool__
,如果它被实现,则使用其返回值。
None
、False
、0.0
、0
将求值为 False
,因为它们的 __bool__
方法返回 False
。如果没有实现 a.__bool__
,则会检查 a.__len__.__bool__
返回什么。
''
、[]
、set()
、dict()
等将求值为 False
,因为它们的 __len__
方法返回 0
。这是因为 bool(0)
是 False
。如果甚至都没有实现 a.__len__
,那么它就返回 True
。
True
。另请参见:Python文档中的真值测试。
if X is not None
怎么会是 False 呢? - Lin Ma__bool__
或__len__
? - Lin Mahelp(a)
会显示有关实例的所有信息,或者尝试 print a.__bool__()
或 print a.__len__()
(或快捷方式 bool(a)
, len(a)
),看看会引发错误(则未实现)还是是否打印出结果(则已实现)。 - MSeifertif not X
(X可以是任何自定义的类类型)来检查一个对象是否为空,但我没有看到他们是否定义了__bool__
或len
对象?想知道这种写法/方法是否正确?谢谢。 - Lin MaIn [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
if not X
(X可以是任何类型的对象),如果在Python中一个变量必须指向某个对象,那么if not X
怎么会是False呢?谢谢。 - Lin Maif not X
将会是False。 - tianweiis
运算符比较对象的标识(可以使用 id(something)
检查某个对象的标识)。由于仅有一个 None
实例,因此表达式 something is None
的结果除非是 None is None
或者 something == None
,否则都会返回 False
。运算符 not
优先级低于比较运算符(其中包含 is
),所以对于形如 not string is None
和 not (string is None)
的表达式,结果总是 True
。
然而,如果字符串不为空,则被视为 True
,如果为空字符串,则被视为 False
。
因此,其中一个表达式的结果始终为 True
,而另一个可能会有所变化,所以它们并不等价。
if not X
(X可以是任何类型的对象),如果在Python中一个变量必须指向某个对象,那么if not X
怎么可能是False呢?谢谢。 - Lin Manot str is None
中的not
是作用于str
还是作用于str is None
?谢谢。 - Lin Manot
的优先级比比较运算符低,因此 not str is None
等同于 not (str is None)
。我已经编辑并修复了答案。 - Salvafoo=''
if foo:
print (1)
else:
print (2)
if not foo is None:
print (3)
else:
print (4)
它将会打印
2
3
if X is not None
怎么会是False呢? - Lin Ma