我正在做一项任务来编译Pascal的子集,在初始程序中有一行代码如下:
if x.tp == y.tp in {Bool, Int}:
some other code ...
这让我非常困惑,因为x.tp==y.tp
返回一个布尔值True
或False
,因此{Bool,Int}中的True/False总是返回
False
。
Bool
和Int
的定义如下:
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
?
当然,我们假设这行代码
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比较运算符链接
使用括号将相等比较分组:
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,为什么将其解释为,从而导致的原因。