Python != 操作与“不是”

2025-02-14 09:50:00
admin
原创
45
摘要:问题描述:在对这个问题的评论中,我看到一个建议使用result is not None 对比result != None 有什么区别?为什么其中一个更受推荐?解决方案 1:==是一个相等性测试。它检查右侧和左侧是否是相等的对象(根据它们的__eq__或__cmp__方法)。is是身份测试。它检查右侧和左侧是否...

问题描述:

在对这个问题的评论中,我看到一个建议使用

result is not None

对比

result != None

有什么区别?为什么其中一个更受推荐?


解决方案 1:

==是一个相等性测试。它检查右侧和左侧是否是相等的对象(根据它们的__eq____cmp__方法)。

is身份测试。它检查右侧和左侧是否是同一个对象。没有进行任何方法调用,对象无法影响操作is

您可以使用is(和is not) 来表示单例,例如None,当您不关心可能想要假装的对象时None,或者当您想要防止对象在与 进行比较时被破坏时None

解决方案 2:

首先,让我介绍几个术语。如果您只想得到问题的答案,请向下滚动到“回答您的问题”。

定义

对象身份:当你创建一个对象时,你可以将它分配给一个变量。然后你也可以将它分配给另一个变量。等等。

>>> button = Button()
>>> cancel = button
>>> close = button
>>> dismiss = button
>>> print(cancel is close)
True

在这种情况下,cancelclosedismissall 引用内存中的同一个对象。您只创建了一个Button对象,所有三个变量都引用这个对象。我们说cancelclosedismissall 引用相同的对象;也就是说,它们引用一个对象。

对象相等性:比较两个对象时,通常不会关心它们是否引用内存中的一个对象。使用对象相等性,您可以定义自己的规则来比较两个对象。当您编写 时if a == b:,您实际上是在说if a.__eq__(b):。这允许您定义一个__eq__方法,a以便您可以使用自己的比较逻辑。

平等比较的基本原理

原理:两个对象拥有完全相同的数据,但并不相同。(它们不是内存中的同一个对象。)
示例:字符串

>>> greeting = "It's a beautiful day in the neighbourhood."
>>> a = unicode(greeting)
>>> b = unicode(greeting)
>>> a is b
False
>>> a == b
True

注意:我在这里使用 unicode 字符串,因为 Python 足够智能,可以重用常规字符串,而无需在内存中创建新的字符串。

这里,我有两个 unicode 字符串,ab。它们具有完全相同的内容,但它们在内存中不是同一个对象。但是,当我们比较它们时,我们希望它们相等。这里发生的事情是 unicode 对象已经实现了该__eq__方法。

class unicode(object):
    # ...

    def __eq__(self, other):
        if len(self) != len(other):
            return False

        for i, j in zip(self, other):
            if i != j:
                return False

        return True

注意:__eq__on 的unicode实现肯定比这个更有效率。

原理:两个对象有不同的数据,但如果某些关键数据相同,则被视为同一对象。
示例:大多数类型的模型数据

>>> import datetime
>>> a = Monitor()
>>> a.make = "Dell"
>>> a.model = "E770s"
>>> a.owner = "Bob Jones"
>>> a.warranty_expiration = datetime.date(2030, 12, 31)
>>> b = Monitor()
>>> b.make = "Dell"
>>> b.model = "E770s"
>>> b.owner = "Sam Johnson"
>>> b.warranty_expiration = datetime.date(2005, 8, 22)
>>> a is b
False
>>> a == b
True

这里,我有两台戴尔显示器ab。它们的品牌和型号相同。但是,它们既没有相同的数据,也不是内存中的相同对象。但是,当我们比较它们时,我们希望它们相等。这里发生的事情是 Monitor 对象实现了该__eq__方法。

class Monitor(object):
    # ...

    def __eq__(self, other):
        return self.make == other.make and self.model == other.model

回答你的问题

与 进行比较时None,始终使用is not。 None 在 Python 中是单例 - 内存中只有一个实例。

通过比较身份,这可以非常快速地完成。Python 检查您引用的对象是否具有与全局 None 对象相同的内存地址 - 非常非常快速地比较两个数字。

通过比较相等性,Python 必须查找对象是否有__eq__方法。如果没有,它会检查每个超类以查找方法。如果找到一个,Python 就会调用它。如果方法很慢并且在注意到另一个对象是时没有立即返回,__eq__这种情况尤其糟糕。__eq__`None`

你没有实现吗__eq__?那么 Python 可能会找到该__eq__方法object并改用该方法 - 无论如何它只是检查对象身份。

当与 Python 中的大多数其他事物进行比较时,您将使用!=

解决方案 3:

请考虑以下情况:

class Bad(object):
    def __eq__(self, other):
        return True

c = Bad()
c is None # False, equivalent to id(c) == id(None)
c == None # True, equivalent to c.__eq__(None)

解决方案 4:

None是单例,因此身份比较总是有效的,而对象可以通过伪造相等性比较来做到这一点.__eq__()

解决方案 5:

>>> () 是 ()
真的

>>> 1 是 1
真的

>>> (1,)==(1,)
真的

>>> (1,)是(1,)
错误的

>>> a = (1,)
>>> b = a
>>> a 是 b
真的

有些对象是单例的,因此is与它们等同于==。大多数不是。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用