当前位置: 首页 > 面试题库 >

Python如果不是== vs如果!=

狄令
2023-03-14
问题内容

这两行代码有什么区别:

if not x == 'val':

if x != 'val':

一个比另一个更有效吗?

会更好用吗

if x == 'val':
    pass
else:

问题答案:

使用dis一下两个版本生成的字节码:

not ==

  4           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 RETURN_VALUE

!=

  4           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               3 (!=)
              9 RETURN_VALUE

后者的操作较少,因此效率可能会略高一些。

在致谢中指出了),您所进行的操作iffoo != barif not foo == bar操作数量完全相同,只是COMPARE_OP更改并POP_JUMP_IF_TRUE切换为POP_JUMP_IF_FALSE

not ==

  2           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               2 (==)
              9 POP_JUMP_IF_TRUE        16

!=

  2           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               3 (!=)
              9 POP_JUMP_IF_FALSE       16

在这种情况下,除非每次比较所需的工作量有所不同,否则您根本看不到任何性能差异。

但是,请注意,这两个版本 不会永远是逻辑上相同的
,因为这将取决于实现方式__eq____ne__有问题的对象。根据数据模型文档:

比较运算符之间没有隐含的关系。的真相x==y并不意味着那x!=y是错误的。

例如:

>>> class Dummy(object):
    def __eq__(self, other):
        return True
    def __ne__(self, other):
        return True


>>> not Dummy() == Dummy()
False
>>> Dummy() != Dummy()
True

最后,也许是最重要的一点:通常,两者 逻辑上相同, x != y 因此可读性比not x == y



 类似资料:
  • 问题内容: 我可以用吗: 代替 后者似乎太冗长。有区别吗? 问题答案: 该声明 将调用(请参阅特殊方法名称文档)并使用该函数的返回值。总结如下: 要求执行真值测试和内置操作;应该返回或,或者它们的整数等效值或。如果未定义此方法,则调用该方法(如果已定义),并且如果其结果为非零,则将该对象视为true。如果一个类既未定义,也未定义,则其所有实例均被视为true。 另一方面, 仅 将参考与进行比较以查

  • 问题内容: 抱歉,是否曾经有人问过这个问题,但是我徒劳地寻找我 确切 问题的答案。基本上,对于Python 2.7,我有一个程序运行一系列地理处理工具,具体取决于用户在脚本中调整的一系列True / False变量所要求的内容,例如 但是,我现在发现x不必在字面上是“ True”即可运行该函数。例如: 因此,除False以外的任何值似乎都将评估为True,如果 x == True 或 x为True

  • 问题内容: 我一直以样式进行编码,但是,一些指南引起了我的注意,尽管这种样式有效,但似乎存在两个潜在问题: 它不完全可读;当然更容易理解。 这可能影响后(并导致微妙的错误),因为像,并会评估为也。 我也开始将此想法应用于其他比较,例如: 与 与 清单也是如此… 问题是,您对这一原则走了多远?在确保代码安全的同时,在哪里划界线? 无论如何,我应该始终使用该样式吗? 问题答案: 如果需要的话,可以使用

  • 本文向大家介绍knockout.js 如果/如果不是,包括了knockout.js 如果/如果不是的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用if绑定来确定是否应创建节点的子元素。 if绑定的逆是ifnot 相当于 有时,您无需创建容器就无法控制元素的存在(通常是针对中的<li>元素<ul>或中的<option>元素<select>) 淘汰赛可使用基于注释标签的无容器控制流语法来实现

  • 我刚刚开始学习python,通过《像计算机科学家一样思考》这本书,我陷入了一些语言语法。 当我使用一些输入(比如7)运行此程序时,会收到如下错误消息: 为什么if语句不能正常工作?即使输入值小于20,它仍会进入第一个if语句

  • 问题内容: 我试图重构代码,并且遇到了这段代码。您能提出建议中的任何重构方法,请说出您使用的折射方法。 问题答案: 您实际上违反了SRP(单一职责原则),因此,每当添加新语言时,都需要触摸此代码库。 为了避免列出大量,您需要一个松散耦合的设计,其中()行为应在单独的类(如英语等)中实现,如下面的代码所示,该代码使用状态模式: 步骤(1):定义界面 步骤(2):定义实现 步骤(3):修改带对象的方法