Python 中的相等运算符而不是相等运算符

equality and not equality operators in Python

提问人:winter 提问时间:12/24/2022 更新时间:12/24/2022 访问量:54

问:

假设我有以下两个列表:

number_list_1 = [1, 2, 3, 4, 5]
number_list_2 = [1, 2, 3, 4, 5]

那么假设我想知道这两个列表是否相等(在 Python 中有很多方法可以做到这一点,这不是我想要的,这在 Python 中也不是一个很好的方法)

解决方案 1:

def list_equality_1(l1, l2):

    # Assuming that two array like objects have the same length
    length = len(l1)

    for i in range(length):
        if l1[i] == l2[i]:
            continue
        else:
            return False
    return True

解决方案 2:

def list_equality_1(l1, l2):

    # Assuming that two array like objects have the same length
    length = len(l1)

    for i in range(length):
        if l1[i] != l2[i]:
            return False
    return True

在这两种解决方案中,每次循环时,我们都在计算 if 语句,对于第一个语句,我们评估是否相等,对于第二个,我们评估第 i 个位置的元素是否相等。 我的问题是哪个更好?首先评估“平等”并使用 else 语句,还是评估“不相等”?我想知道编译器如何处理这个问题。

python 循环 if 语句 相等

评论

1赞 Carcigenicate 12/24/2022
如果您想知道编译器如何处理每个函数,请将每个函数命名为 : 。我不认为会有任何惊喜;我希望编译后的代码看起来非常相似。我认为可读性是这里唯一的问题。不过,您需要第一种方式这一事实会使我使用第二种方式。disfrom dis import dis; dis(list_equality_1); dis(list_equality_2) continue
1赞 deceze 12/24/2022
井。。。如果你问我,第一个是不必要的冗长。

答:

2赞 FLAK-ZOSO 12/24/2022 #1

我的问题是哪个更好?

我的回答是第二个更好。

  • 您浪费的线路更少
  • 每个人都知道无论如何都是隐含的continue

当我需要时,我总是使用第二个代码,甚至像你之前所说的那样,还有其他几种方法可以在 Python 中比较 s,我说的是 C/C++。list


length = len(l1)

for i in range(length):
    if l1[i] != l2[i]:
        return False
return True

这段代码是无用的冗长,我会这样缩短它。

for first, second in zip(l1, l2):
    if first != second:
        return False
return True

阅读有关内置类 zip 的文档可能对您有所帮助。

默认情况下,当最短可迭代对象用尽时停止。它将忽略较长可迭代对象中的剩余项,将结果截断为最短可迭代对象的长度。zip()

因此,这种替代方法仅适用于 ,但这也适用于您的代码。len(l1) == len(l2)


正如我之前所说,我想知道编译器如何处理相等 (==) 而不是相等 (!=) 运算符。

好吧,我认为您从未编译过 Python 代码,这就是为什么您没有要检查的 或文件。.asm.o.exe

我想知道这些运算符的复杂性。

它们都具有 O(1) 的时间复杂度。

拆卸


Do you see any difference?

两者是等效的,它们生成几乎相同的指令集,除了第 100 行之后的几件事,但这不会影响性能。

评论

0赞 winter 12/24/2022
谢谢你的回答。我不是在寻找解决这个问题的方法。正如我之前所说,我想知道编译器如何处理相等 (==) 而不是相等 (!=) 运算符。并且在 Python 中也否定。我想知道这些运算符的复杂性。编译器用“不相等”来解决它是否更复杂?
0赞 FLAK-ZOSO 12/24/2022
@winter,我编辑了答案,但我将分解您的函数,以告诉您是否真的存在任何差异。无论如何,任何差异都不会影响您的表现。
0赞 FLAK-ZOSO 12/24/2022
很高兴帮助@winter,我希望其他人会投票支持这个答案,因为我花了一些时间来复制 repl 😅 中的函数
1赞 winter 12/24/2022
也许我没有很好地问我的问题,有些人会误解!😅 感谢您的时间和精力!我不会忘记这个,我的朋友!你在我心里有一个大大的徽章!