提问人:winter 提问时间:12/24/2022 更新时间:12/24/2022 访问量:54
Python 中的相等运算符而不是相等运算符
equality and not equality operators in Python
问:
假设我有以下两个列表:
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 语句,还是评估“不相等”?我想知道编译器如何处理这个问题。
答:
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)
的时间复杂度。
拆卸
两者是等效的,它们生成几乎相同的指令集,除了第 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
也许我没有很好地问我的问题,有些人会误解!😅 感谢您的时间和精力!我不会忘记这个,我的朋友!你在我心里有一个大大的徽章!
评论
dis
from dis import dis; dis(list_equality_1); dis(list_equality_2)
continue