当前位置: 首页 > 知识库问答 >
问题:

带有“非x即无”的Yoda条件

古扬
2023-03-14

上一个dev在代码中留下了一个非常奇怪的not x is Noyoda条件:

>>> x = None
>>> not x is None
False
>>> x = 1
>>> not x is None
True

经过一些测试,我发现与x相同的输出不是None

>>> x = None
>>> not x is None
False
>>> x is not None
False
>>> x = 1
>>> not x is None
True
>>> x is not None
True

不是x是无总是等同于x不是无

要分解条件,是不是(x是无)还是(不是x)是无?还是前者永远等同于后者?

共有2个答案

包建义
2023-03-14

is notis(我相信,是Python中唯一的)两个关键字运算符,x不是y完全等同于notx是yid(x)!=id(y)。最好的读者理解标准拼写是x不是y

弓磊
2023-03-14

因为isnot有更高的优先级,所以表达式是等价的:

如果x=Nonex为None计算为True非x为None计算为False如果x=1x为None计算为False非x为None计算为True

如果x=Nox不是No求值为False如果x=1x不是No求值为True

因此,即使这些动作在语法上是不等价的,结果也是等价的。

这是的AST不是x是无

这是x的AST不是None

从第二个图中可以看出,内部节点是比较节点,因此在not之前计算x is No

关于表达式的实际计算,python似乎为这两者创建了相同的字节码。在本例中可以看到:

def foo(x):
    x is not None


def bar(x):
    not x is None

import dis
dis.dis(foo)
dis.dis(bar)

因为两者都产生:

      0 LOAD_FAST                0 (x)
      3 LOAD_CONST               0 (None)
      6 COMPARE_OP               9 (is not)
      9 POP_TOP             
     10 LOAD_CONST               0 (None)
     13 RETURN_VALUE 
 类似资料:
  • Yoda 是一个智能、强大的命令行个人助理,可以帮助您完成一些琐碎的任务,由 Python 编写而成。 用法 Yoda 包含一个简单的聊天机器人。您可以使用下面的聊天命令与它交互。 $ yoda chat who are you 样例输出: Yoda speaks: I'm a virtual agent $ yoda chat how are you I'm doing very well. T

  • 我们正在尝试将应用程序从Spring迁移到Quarkus Spring。我们可以根据需要重新编写应用程序逻辑。问题来了,因为我们正在使用共享的spring罐,这是传统的,而且数量很多。大多数spring JAR都使用@Autowired使用依赖项注入,但被注入的相应类没有@Component注释。 将用示例描述问题: 类“MyProject”属于Quarkus应用程序 类OtherLevelOne

  • 问题内容: 对于似乎很简单的问题,我找不到解决方案。假设有2种实体类: 如何创建一个标准查询以返回包含至少一个满足给定条件(例如b.text =’condition’)的B实体的所有A? 问题答案: 我认为此链接可能很有用:http : //mikedesjardins.net/2008/09/22/hibernate-criteria- subqueries-exists/ 它包含以下有关如何创

  • 问题内容: 我正在寻找类似于uploadify的文件上传器,并带有进度条,该进度条不依赖闪存,最好使用jQuery-这可能吗? 问题答案: 当然可以。几个使用不同代码和教程的站点是: http://github.com/drogus/jquery-upload-progress(由DrJokepu忍者;) http://t.wits.sg/2008/06/25/howto-php-and-jque

  • 我的角码出了什么问题?我得到以下错误: 无法读取BrowserDomAdapter.RemoveClass中未定义的属性“Remove”

  • Spring 4.3.x与JDK 11不兼容。确切地说,在Tomcat上运行的web应用程序中,Spring代码的哪一部分不能与JDK 11兼容?我没有使用Spring AOP、JMS、消息传递、ORM、OXM、测试、Portlet和WebSocket。