我有一个可能很简单的问题,但是想知道这两个语句之间的区别:
if not os.path.isfile(file):
#Do some stuff
if os.path.isfile(file) is False:
#Do some stuff
两者之间有什么区别(如果有)?据我了解,它们都返回一个True
或False
值,所以这仅仅是一个偏好问题还是有明显区别?
答案 0 :(得分:3)
它们不是等效的。考虑以下示例,并尝试自己理解它:
x = None
if not(x):
print("aa")
if x is False:
print("bb")
此示例仅打印“ aa”。为什么?查看@milanbalazs的答案
答案 1 :(得分:1)
在您的情况下,由于我们知道os.path.isfile
返回True
或False
,所以没有区别。
通常,python中有很多对象,当将它们解释为布尔值时,它们的结果将为False
。
考虑一下:
empty_list = []
if not empty_list:
print('List is not empty')
if empty_list is False:
print('List is False')
在其他None
,""
和[]
中,其值将为False
。
因此,通常首选使用not variable
进行测试。
答案 2 :(得分:1)
在python(和其他动态语言)中,存在 truthy / falsy 值的概念。 True/False
并非唯一被评估为真/假的东西
if not []:
print('this will be printed')
if [] is False:
print('this won't)
另一个问题是,您应该比较x == False
,而不要比较x is False
。 False
在当前的CPython实现中是一个单例对象,但这在规范中不能保证。
答案 3 :(得分:0)
您应该知道:False == 0 == None
在if
条件下。如果使用if not
,则可以覆盖所有版本的False(零值)。如果使用== False
,则无法处理0或None
。建议使用if not
。 is
运算符是一个不同的故事(is
与==
不同),但是您可以阅读以下链接的更多详细信息:Understanding Python's "is" operator
答案 4 :(得分:0)
False
只是整数0
的关键字。在if if语句中,任何“ fasly”值将被评估为False,但是只有0
或False
本身将被评估为is False
。
这是因为is
检查匹配的身份,而if not
检查隐式布尔值。
例如:
if not None
评估。
if None is False
没有。
答案 5 :(得分:0)
通常最好使用第一个,因为即使您没有在False
是单例对象的Python实现中检查实际的布尔值,也可以使用第一个。
一致性好,可移植性也好。
>>> if 0 is False: print "false"
>>> if not 0: print "false"
false
>>> if [] is False: print "false"
>>> if not []: print "false"
false
>>> if "" is False: print "false"
>>> if not "": print "false"
false
它还可以防止此类事故的发生:
>>> False = 1
>>> True == False
True