之间有什么区别:
if foo is None: pass
Run Code Online (Sandbox Code Playgroud)
和
if foo == None: pass
Run Code Online (Sandbox Code Playgroud)
我在大多数Python代码(以及我自己编写的代码)中看到的约定是前者,但我最近遇到了使用后者的代码.None是NoneType的实例(也是唯一的实例,IIRC),所以没关系,对吧?它有什么可能的情况吗?
Bre*_*dan 250
is
True
如果它比较同一个对象实例,则总是返回
而==
最终由该__eq__()
方法确定
即
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
Run Code Online (Sandbox Code Playgroud)
Ten*_*she 24
提醒一句:
if foo:
# do something
Run Code Online (Sandbox Code Playgroud)
是不是完全一样:
if x is not None:
# do something
Run Code Online (Sandbox Code Playgroud)
前者是布尔值测试,可以在不同的上下文中评估为false.在布尔值测试中有许多表示false的东西,例如空容器,布尔值.在这种情况下,None也评估为false,但其他事情也是如此.
Myk*_*hko 12
(ob1 is ob2)
等于 (id(ob1) == id(ob2))
tru*_*ppo 12
原因foo is None
是首选方法是您可能正在处理定义自己的对象,并将对象定义__eq__
为None.因此,foo is None
如果您需要查看它是否是实际的,请始终使用None
.
is
测试身份,而不是平等.对于您的语句foo is none
,Python只是比较对象的内存地址.这意味着你问的问题是"同一个对象有两个名字吗?"
==
另一方面,通过该__eq__()
方法确定的相等性测试.它不关心身份.
In [102]: x, y, z = 2, 2, 2.0
In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)
In [104]: x is y
Out[104]: True
In [105]: x == y
Out[105]: True
In [106]: x is z
Out[106]: False
In [107]: x == z
Out[107]: True
Run Code Online (Sandbox Code Playgroud)
None
是一个单身操作员.所以None is None
总是如此.
In [101]: None is None
Out[101]: True
Run Code Online (Sandbox Code Playgroud)
对于“无”,相等(==)和身份(is)之间不应有区别。NoneType可能返回相等性的标识。由于None是唯一可以使用NoneType的实例(我认为这是对的),因此两个操作是相同的。对于其他类型,情况并非总是如此。例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
Run Code Online (Sandbox Code Playgroud)
这将打印“等于”,因为列表具有比较操作,而不是默认返回标识。
@ 杰森:
我建议按照以下方式使用更多内容
Run Code Online (Sandbox Code Playgroud)if foo: #foo isn't None else: #foo is None
我不喜欢使用“ if foo:”,除非foo真正表示一个布尔值(即0或1)。如果foo是字符串或对象或其他对象,则“ if foo:”可能有效,但对我来说似乎是个懒惰的快捷方式。如果要检查x是否为None,请说“如果x为None:”。
归档时间: |
|
查看次数: |
25093 次 |
最近记录: |