如何比较 Python 中的两个实例? 不可变可变

问题描述

是否有可能比较两个“实例”?我有一个变量和一个列表。变量的类型为“实例”,列表中的项目也具有相同的类型。当我将变量与列表中的相同项目进行比较时:

cities = [USA,Poland,England,GB,Italy]
variable = Italy

variable == cities[-1]

我收到了“假”作为输出。我 100% 确定这两个元素是相同的。

提前致谢!

解决方法

Python 中有两种类型的对象。可变的,不可变的。

不可变

  • 状态无法更改。
  • 通常被认为是“原始”类型。
  • intfloatstringtuple

可变

  • 状态可以更新和更改。
  • listdictsetbytearray,任何通过 class 令牌创建的对象。

根据您在说 variable 时所讨论的类型,这将影响运算符 ==。将始终根据实际值检查不可变类型(例如 1 == 1True),其中根据对象的 __eq__ 方法(重载 == 符号)检查可变类型.

列出的所有可变类型 - 除了用 class 初始化的新对象 - 都有内置的 __eq__ 方法,当出现 == 符号时会使用这些方法。假设您正在使用自己的对象,请以以下示例为例:

class Obj:
    def __init__(self,integer):
        self.integer = integer

print(Obj(1) == Obj(1)) # False

请注意,尽管 integer 对于每个 Obj 都是相等的,但由于 Obj 是一个没有 __eq__ 方法的可变类型,Python 将检查对象是否相等根据它们在内存中的空间相互关联 - 换句话说,对于 True,对象必须与您初始化的完全相同。

class Obj:
    def __init__(self,integer):
        self.integer = integer

obj = Obj(1)

print(obj == obj)  # True

要手动重载 == 符号,您必须使用 __eq__ 方法:

class Obj:
    def __init__(self,integer):
        self.integer = integer

    def __eq__(self,other):
        # Comparison of two integers.
        return self.integer == other.integer

print(Obj(1) == Obj(1))  # True