python - 为什么下面的代码会返回 True?

标签 python python-3.x

<分区>

我正在做一个编译 Pascal 子集的作业,在初始程序中有一行代码如下:

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

这让我很困惑,因为 x.tp == y.tp 返回一个 bool 值 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?

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

最佳答案

使用括号对相等比较进行分组:

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

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

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

产生Truey.tp是类 <class 'ST.Int'>实际上在那个集合中。

来自Reference Manual on Comparisons :

Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be False).

关于python - 为什么下面的代码会返回 True?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42332759/

相关文章:

python - 如何避免读取 Tensorflow 中每个请求的图表

python - 进行异步 API 调用时如何限制 Grequests?

带有 Django : ImportError: No module named 'openid.association' 的 python-social-auth

python - 如何将 DICOM 文件的 header 数据存储在 Pandas 数据框中?

python - 在 python virtualenv 中使用 pip 安装 scrapy 时发生错误

python - 自动检测/转换数据类型?

python - 在 Cygwin 中为 Anaconda 永久设置 Python 路径

python - Docker-Compose Postgresql 初始化入口点

python - 具有局部变量的全局方法线程安全

python - 在列表中查找组合的更优雅的方法是什么?