“foo is None”和“foo == None”之间有什么区别?

2025-03-13 09:07:00
admin
原创
105
摘要:问题描述:以下两者之间有区别吗:if foo is None: pass 和if foo == None: pass 我在大多数 Python 代码(以及我自己编写的代码)中看到的惯例是前者,但我最近遇到了使用后者的代码。 None 是 NoneType 的一个实例(也是唯一的实例,如果我没记错的话),所以这...

问题描述:

以下两者之间有区别吗:

if foo is None: pass

if foo == None: pass

我在大多数 Python 代码(以及我自己编写的代码)中看到的惯例是前者,但我最近遇到了使用后者的代码。 None 是 NoneType 的一个实例(也是唯一的实例,如果我没记错的话),所以这应该没关系,对吧? 有什么情况下可能会这样吗?


解决方案 1:

is`True如果比较同一个对象实例则总是返回,而==最终则由__eq__()`方法决定。

IE

>>> class Foo:
        def __eq__(self, other):
            return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False

解决方案 2:

您可能想要阅读此内容:对象标识和等价性。

is运算符用于测试对象身份;它检查两个对象是否引用内存中的同一地址。

==运算符用于测试等价性;它检查两个对象是否具有等价状态。

解决方案 3:

需要注意的是:

if foo:
    # do something

与以下内容不完全相同:

if foo is not None:
    # do something

前者是布尔值测试,在不同情况下可能求值为 false。在布尔值测试中,有许多事物表示 false,例如空容器、布尔值。None在这种情况下也求值为 false,但其他事物也是如此。

解决方案 4:

原因foo is None是首选方法是您可能正在处理一个定义其自己的对象__eq__,并且该对象定义为等于 None。因此,foo is None如果您需要查看它是否是事实上的,请始终使用None

解决方案 5:

(ob1 is ob2)功能等同于(id(ob1) == id(ob2))

解决方案 6:

没有区别,因为相同的对象当然是相等的。然而,PEP 8明确指出你应该使用is

与 None 等单例的比较应该始终使用 is 或 is not 来完成,而永远不要使用相等运算符。

解决方案 7:

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

None是单例运算符。因此None is None始终为真。

In [101]: None is None
Out[101]: True

解决方案 8:

对于 None 来说,相等 (==) 和身份 (is) 之间不应该有区别。NoneType 可能返回身份以表示相等。由于 None 是 NoneType 的唯一实例(我认为这是真的),因此这两个操作是相同的。对于其他类型,情况并非总是如此。例如:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

这将打印“Equal”,因为列表具有比较操作,而不是默认的身份返回。

解决方案 9:

@杰森:

我建议使用类似

if foo:
    #foo isn't None
else:
    #foo is None

我不喜欢使用“if foo:”,除非 foo 确实代表布尔值(即 0 或 1)。如果 foo 是字符串、对象或其他东西,“if foo:”可能有效,但在我看来,这似乎是一种偷懒的捷径。如果您要检查 x 是否为 None,请说“if x is None:”。

解决方案 10:

更多细节:

  1. is子句实际上检查两个是否object位于相同的内存位置。即,它们是否都指向相同的内存位置并具有相同的id

  2. 作为 1 的结果,is确保两个词汇表示的 s 是否object具有相同的属性(属性的属性......)

  3. 原始类型的实例,例如,bool(有一些例外),具有相同的值,并且将始终位于相同的内存位置。int`string`NoneType

例如

>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True

并且由于NoneType在 python 的“查找”表中只能有一个自身的实例,因此前者和后者更多的是编写代码的开发人员的编程风格(可能是为了一致性),而不是有任何微妙的逻辑理由来选择其中一个。

解决方案 11:

John Machin 的结论None是单例,这个结论得到了本代码的支持。

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

由于None是单例,x == None因此x is None结果相同。但是,从我的审美观点来看,x == None是最好的。

解决方案 12:

a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4027  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2755  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   86  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   99  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   87  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用