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

为什么下面的代码返回True?[副本]

呼延卓
2023-03-14

我正在做一项任务来编译Pascal的子集,在初始程序中有一行代码如下:

if x.tp == y.tp in {Bool, Int}:
    some other code ...

这让我非常困惑,因为x.tp==y.tp返回一个布尔值TrueFalse,因此{Bool,Int}中的True/False总是返回False

BoolInt的定义如下:

class Int: pass

class Bool: pass

然后,我在那一行设置了一个断点,并在VSCode的调试器中进行调试:

>> x.tp
<class 'ST.Int'>
>> y.tp
<class 'ST.Int'>
>> x.tp == y.tp
True
>> a = (x.tp == y.tp)
None
>> a
True
>> a in {Bool, Int}
False
>> x.tp == y.tp in {Bool, Int}
True       <----------------------- why does it return True?

为什么{Bool,Int}中的x.tp==y.tp在这里返回True


共有2个答案

谷泳
2023-03-14

当然,我们假设这行代码

if x.tp == y.tp in {Bool, Int}:

应该像这样工作(或解析):

if (x.tp == y.tp) in {Bool, Int}:

但事实并非如此。根据本文,解析和比较是这样完成的:

if (x.tp == y.tp) and (y.tp in {Bool, Int}) :

因为不明确,有些事情让人困惑。为了代码维护者的利益,请尽量避免类似的情况。

来源:Python比较运算符链接

阳凌
2023-03-14

使用括号将相等比较分组:

if (x.tp == y.tp) in {Bool, Int}:

您的链式比较会被Python评估为:

if x.tp == y.tp and y.tp in {Bool, Int}:

因为y.tp属于

《比较参考手册》:

比较可以任意链接,例如,x

 类似资料:
  • 下面的代码抛出,但我不明白为什么,该对象不是null。

  • 输出为 为什么第一行返回true,而第二行返回false?这里有什么诀窍,因为两者都在类上调用。

  • 问题内容: 标题是整个问题。有人可以告诉我为什么会这样吗? 问题答案: 是的-因为它确实以空字符串开头。实际上,空字符串在逻辑上在每对字符之间出现。 这样说:你能给“开始于”的什么定义排除这种情况?这是“开始于”的简单定义,它没有: “如果x的前几个字符与y的第一个字符匹配,则x 以y开头。” 替代(等效)定义: “如果“ x以y开头”

  • 问题内容: 如果我这样做: 那又回来了。仅仅是因为在列表中。 但是,如果我这样做: 那又回来了。而等于: 为什么? 问题答案: 运算符优先级 2.x,3.x。的优先级低于的优先级。因此,它等效于: 这就是你想要的: 正如@Ben指出的那样:建议从不写作,更喜欢。前者使它看起来像一个函数调用,而它却是一个运算符,而不是一个函数。

  • 我和我的同事有一个bug,这是由于我们假设调用的空流将返回。 当然,这是我们假设而不阅读文档的错误。但我不理解的是,为什么空流的默认行为返回。这样做的理由是什么?与(相反返回false)一样,该操作以命令方式使用,脱离单子,可能用于语句。考虑到这些事实,是否有任何理由让空流上的默认为对于大多数用途是可取的?

  • 问题内容: 我在jsfiddle.net上玩,我很好奇为什么返回true? 这样: 但这不是: 这个怪癖有用吗? 问题答案: 操作顺序导致在javascript中解释为产生,并且true计为1,导致其返回true。 这也是为什么返回false,返回true,为什么将其解释为,从而导致的原因。