if not False:
print "False is false."
if not 0:
print "0 is false."
if not []:
print "An empty list is false."
if not ():
print "An empty tuple is false."
if not {}:
print "An empty dict is false."
if not "":
print "An empty string is false."
False、0、()、[]、{}和""都与None不同,因此您的两个代码片段是而不是等价的。
此外,请考虑以下几点:
>>> False == 0
True
>>> False == ()
False
if object:是而不是一个等式检查。0、()、[]、None、{}等都是彼此不同,但它们都将评估为False。
- Comparisons to singletons like None should always be done with
'is' or 'is not', never the equality operators.
Also, beware of writing "if x" when you really mean "if x is not None"
-- e.g. when testing whether a variable or argument that defaults to
None was set to some other value. The other value might have a type
(such as a container) that could be false in a boolean context!
有多少单身汉?五:None,True,False,NotImplemented和Ellipsis。因为您不太可能使用NotImplemented或Ellipsis,而且您永远不会说if x is True(因为if x更清楚),所以您将只测试None。
因为
None
不是唯一被认为是错误的东西。False
、0
、()
、[]
、{}
和""
都与None
不同,因此您的两个代码片段是而不是等价的。此外,请考虑以下几点:
if object:
是而不是一个等式检查。0
、()
、[]
、None
、{}
等都是彼此不同,但它们都将评估为False。这就是短路表达背后的“魔力”,比如:
简写为:
尽管你真的应该写:
在第一个测试中,Python尝试将对象转换为一个
bool
值(如果它还不是一个值)。粗略地说,我们问的是:你有没有意义?这是使用以下算法完成的:如果对象有一个
__nonzero__
特殊方法(就像数字内置的int
和float
),它将调用此方法。它必须返回一个随后直接使用的bool
值,或者如果等于零,则返回一个被视为int
值。否则,如果对象有一个
__len__
特殊方法(容器内置的list
,dict
,set
,tuple
,…),则调用此方法,如果该方法为空(长度为零),则考虑容器False
。否则,对象被认为是
True
,除非它是None
,在这种情况下,它被认为是False
。在第二个测试中,比较对象是否与
None
相等。在这里,我们问这个对象,“你是否等于另一个值?”这是使用以下算法完成的:如果对象具有
__eq__
方法,则调用该方法,然后将返回值转换为bool
值,并用于确定if
的结果。否则,如果对象有一个
__cmp__
方法,则调用它。此函数必须返回一个int
,指示两个对象的顺序(-1
如果self < other
,0
如果self == other
,+1
如果self > other
)。否则,将比较对象的标识(即它们是对同一对象的引用,可以通过
is
运算符进行测试)。可以使用
is
运算符进行另一个测试。我们会问对象,“你是这个特定对象吗?”一般来说,我建议对非数值使用第一个测试,当您要比较相同性质的对象(两个字符串、两个数字,…)时使用相等测试,并且仅当使用sentinel值时才检查标识(例如,
None
表示没有为成员字段初始化,或者当使用getattr
或__getitem__
方法时)。总而言之,我们有:
这实际上都是不好的做法。曾几何时,人们认为随便地把“无”和“假”当作相似的东西是可以的。但是,由于Python2.2,这不是最好的策略。
首先,在进行
if x
或if not x
类型的测试时,Python必须隐式地将x
转换为布尔值。函数bool
的规则描述了大量的错误;其他的都是正确的。如果x的值一开始不是正确的布尔值,那么这种隐式转换并不是最清晰的表达方式。在Python2.2之前,没有bool函数,所以它就更不清晰了。
第二,您不应该真正使用
== None
进行测试。您应该使用is None
和is not None
。见政治公众人物8,Style Guide for Python Code。
有多少单身汉?五:
None
,True
,False
,NotImplemented
和Ellipsis
。因为您不太可能使用NotImplemented
或Ellipsis
,而且您永远不会说if x is True
(因为if x
更清楚),所以您将只测试None
。相关问题 更多 >
编程相关推荐