我可以使用:
if A:
而不是
if A is not None:
后者似乎太啰嗦了。有区别吗?
我可以使用:
if A:
而不是
if A is not None:
后者似乎太啰嗦了。有区别吗?
当前回答
其他答案都提供了很好的信息,但我觉得这一点需要澄清。
不,你不应该使用:
if A:
如果你需要测试的是:
if A is not None:
前者通常可以作为后者的替代品,但前者是难以发现bug的常见来源。即使您所做的只是编写一些快速的一次性代码,也不应该让自己养成编写bug代码的习惯。训练你的手指和大脑来写和读正确的详细的测试形式:
if A is not None:
None的常用用法是定义可选的参数值,并给一个变量一个默认的起始值,这意味着“还没有值”,而函数则意味着“没有返回值”。如果你写这样一个函数:
def my_func(a_list, obj=None):
if obj: # Trying to test if obj was passed
a_list.append(obj)
# do something with a_list
这将适用于许多现实世界的使用,如:
my_func(user_names, "bob")
但如果发生这种情况:
my_func(user_names, "")
my_func(user_names, [])
my_func(user_names, 0)
那么长度为零的对象将不会被添加到列表中。在编写第一个代码时,您可能知道不允许零长度的用户名。所以短代码可以正常工作。但是当您尝试修改代码以使用一个空字符串来表示没有名字的匿名用户之类的东西时,这个函数突然停止了它所期望做的事情(将匿名用户添加到列表中)。
例如,假设你有逻辑来定义何时允许用户登录,写如下:
new_user = get_user_name()
if user_list_ok(my_func(current_users, new_user)):
# user_list_ok() tests that no more than 10 users can
# log in at the same time, and that no sigle user can
# can log in more than 3 times at once.
# This user is allowed to log in!
log_user_in(new_user)
现在这会在代码中产生微妙而复杂的错误。“”的匿名用户不会被添加到测试的列表中,因此当系统达到10个用户的限制时,测试仍然允许匿名用户登录,将用户计数推到11。然后,这可能会在系统的另一部分触发一个只需要最多10个用户的错误。
当你需要测试“var没有值”时,你应该总是使用更长的“is not None”测试,即使它看起来很丑很冗长。
其他回答
该声明
if A:
将调用A.__bool__()(参见特殊方法名称文档),在Python 2中称为__nonzero__,并使用该函数的返回值。总结如下:
object.__bool__(自我) 调用来实现真值测试和内置操作bool();应该返回False或True。如果没有定义此方法,则调用__len__(),如果对象的结果是非零,则认为该对象为真。如果一个类既没有定义__len__()也没有定义__bool__(),则它的所有实例都被认为是真。
另一方面,
if A is not None:
只比较引用A和None,看它们是否相同。
Python >= 2.6,
如果我们写如
if A:
将生成如下警告:
FutureWarning:该方法的行为将来会改变 版本。使用特定的'len(elem)'或'elem is not None'测试 代替。
所以我们可以用
if A is not None:
他们做的事情非常不同。
下面检查A除了False、[]、None和0之外是否有其他值。它检查A的值。
if A:
下面检查A是否与None是不同的对象。它检查并比较A和None的引用(内存地址)。
if A is not None:
更新:进一步解释
很多时候,这两者似乎做同样的事情,所以很多人互换使用它们。两者给出相同结果的原因是由于解释器/编译器的优化,如实习或其他原因,很多时候纯属巧合。
考虑到这些优化,相同值的整数和字符串最终将使用相同的内存空间。这可能解释了为什么两个独立的弦表现得好像是一样的。
> a = 'test'
> b = 'test'
> a is b
True
> a == b
True
其他的事情就不一样了。
> a = []
> b = []
> a is b
False
> a == b
True
这两个列表显然有自己的记忆。令人惊讶的是,元组的行为与字符串相似。
> a = ()
> b = ()
> a is b
True
> a == b
True
这可能是因为元组被保证不会改变,因此重用相同的内存是有意义的。
这表明您应该对所使用的比较运算符格外警惕。根据您真正想检查的内容使用is和==。这些东西很难调试,因为它读起来就像散文,我们经常只是粗略地浏览它。
if x: #x is treated True except for all empty data types [],{},(),'',0 False, and None
所以它不等于
if x is not None # which works only on None
其他答案都提供了很好的信息,但我觉得这一点需要澄清。
不,你不应该使用:
if A:
如果你需要测试的是:
if A is not None:
前者通常可以作为后者的替代品,但前者是难以发现bug的常见来源。即使您所做的只是编写一些快速的一次性代码,也不应该让自己养成编写bug代码的习惯。训练你的手指和大脑来写和读正确的详细的测试形式:
if A is not None:
None的常用用法是定义可选的参数值,并给一个变量一个默认的起始值,这意味着“还没有值”,而函数则意味着“没有返回值”。如果你写这样一个函数:
def my_func(a_list, obj=None):
if obj: # Trying to test if obj was passed
a_list.append(obj)
# do something with a_list
这将适用于许多现实世界的使用,如:
my_func(user_names, "bob")
但如果发生这种情况:
my_func(user_names, "")
my_func(user_names, [])
my_func(user_names, 0)
那么长度为零的对象将不会被添加到列表中。在编写第一个代码时,您可能知道不允许零长度的用户名。所以短代码可以正常工作。但是当您尝试修改代码以使用一个空字符串来表示没有名字的匿名用户之类的东西时,这个函数突然停止了它所期望做的事情(将匿名用户添加到列表中)。
例如,假设你有逻辑来定义何时允许用户登录,写如下:
new_user = get_user_name()
if user_list_ok(my_func(current_users, new_user)):
# user_list_ok() tests that no more than 10 users can
# log in at the same time, and that no sigle user can
# can log in more than 3 times at once.
# This user is allowed to log in!
log_user_in(new_user)
现在这会在代码中产生微妙而复杂的错误。“”的匿名用户不会被添加到测试的列表中,因此当系统达到10个用户的限制时,测试仍然允许匿名用户登录,将用户计数推到11。然后,这可能会在系统的另一部分触发一个只需要最多10个用户的错误。
当你需要测试“var没有值”时,你应该总是使用更长的“is not None”测试,即使它看起来很丑很冗长。