Why does the following code return True?
本问题已经有最佳答案,请猛点这里访问。
我正在做一个任务来编译pascal的一个子集,在初始程序中有一行这样的代码:
1 2 | if x.tp == y.tp in {Bool, Int}: some other code ... |
这让我很困惑,因为
1 2 3 | class Int: pass class Bool: pass |
号
然后,我在该行设置了一个断点,并在vscode的调试器中四处播放:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >> 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? |
为什么
使用括号对相等比较进行分组:
1 | if (x.tp == y.tp) in {Bool, Int}: |
号
python对链接比较的评估如下:
1 | if x.tp == y.tp and y.tp in {Bool, Int}: |
由于
参考比较手册:
Comparisons can be chained arbitrarily, e.g.,
x < y <= z is equivalent tox < y and y <= z , except thaty is evaluated only once (but in both casesz is not evaluated at all whenx < y is found to beFalse ).
号
当然,我们假设这一行代码
1 | if x.tp == y.tp in {Bool, Int}: |
应该工作(或分析)如下:
1 | if (x.tp == y.tp) in {Bool, Int}: |
号
但事实并非如此。根据本文,解析和比较的过程如下:
1 | if (x.tp == y.tp) and (y.tp in {Bool, Int}) : |
由于不明确,有些事情令人困惑。为了代码维护人员的利益,请尽量避免类似的情况。
源:python比较运算符链接