为什么Python中`True==false is False`的计算结果为false?(2013)

2020-05-02 18:06:03

在使用==但不使用is的表达式上,我得到了一些相当意外的行为:

>;>;>;(True==False)为FalseTrue>;>;>;True==(False为False)True>;>;>;True==FalseFalse>;>;>;id(True)8978640>;>;>;id(False)8978192>;>;id(True)。

噢。事实证明,这与is vs==没有任何关系,因为在任何一种情况下,表达式的计算结果都为false。-谢谢你所有的快速回答!-哈雷鲁。

@Mars jnPieters在输入我的答案时,我想这肯定是以前问过的问题,但我想这可能很难用Google搜索。这个问题可能是另一个重复的问题。-乔尔盖卡(Jorgeca)。

与我的问题相关:为什么(1 in[1,0]==True)评估为False?-彼得·伍德。

我认为对于回答问题的人来说,这将是一个很好的面试问题,从1到10分,你的蟒蛇技能如何?--布莱恩·奥克利(Bryan Oakley)--布莱恩·奥克利(Bryan Oakley)--布莱恩·奥克利(Bryan Oakley)。

在这种情况下,这可能会令人惊讶,但它允许您编写1<;=x<;4,这与其他语言(如C)不同。

@NullUserException Mmm我认为不需要它们,因为可能的运算符是";<;";|";>;";|";>;==";|";<;=";|";<;>;";|";!=";|&##。]|";中的[";NOT";]";,它们的优先级都低于和。(顺便说一句,谢谢你的语法修正,这对我们非母语人士真的很有帮助)。-乔尔盖卡(Jorgeca)。

这正是我倾向于将复合逻辑比较放在括号中的原因,我根本记不住我使用的所有语言的语法,因此不值得冒险将它们去掉并产生意外的行为。这就是为什么我倾向于用括号括起复合逻辑比较的原因,因为我根本记不住我使用的所有语言的语法,也不值得冒这样的风险而导致意外行为。-ZzzzzBov。

x<;y<;=z等同于x<;y和y<;=z,不同之处在于y只评估一次(但在这两种情况下,当x<;y被发现为False时,根本不评估z)。

在您的示例中,True==False等同于True==False,False是False,因为第一个条件为False,所以它会短路并返回False。

>;>;dis.dis(lambda:true==false is false)1 0 LOAD_GLOBAL 0(True)3 LOAD_GLOBAL 1(FALSE)6 DUP_TOP 7 ROT_THARE 8 COMPARE_OP 2(==)11 JUMP_IF_FALSE_OR_POP 21<;-此步骤14 LOAD_GLOBAL 1(FALSE)17 COMPARE_OP 8(IS)20 RETURN_VALUE>;>;21。

我没有投反对票,但在我看来,对语言规则的描述足以理解正在发生的事情。反汇编似乎没有添加太多内容(除了关注特定于实现的细节)。--赵小兰。

与C不同的是,Python中的所有比较操作都有相同的优先级,比任何算术、移位或按位操作的优先级都要低。同样与C不同的是,像a<;b<;c这样的表达式有数学上的常规解释:

比较::=or_expr(COMP_OPERATOR或_EXPR)*COMP_OPERATOR::=";<;";|";>;";|";>;=";|";<;=";|";<;>;";|";!=";|&。]|";中的[";不是";]";

TRUE==FALSE IS FALSE是链式比较,表示与(True==False)和(False是False)相同。由于第一次比较(True==False)为False,因此链接比较的结果为False。

不是你想要的答案吗?浏览标记的其他问题或提出您自己的问题。