Python PEP 435关于enum
module说明了调查员should be compared with is
而不是通常的==
。我猜这个推理是因为枚举成员是静态的并且不会改变,所以它是有意义的。
我出于兼容性原因使用Python 2.7.9而且我不想在项目中引入太多新库,因此我不打算使用{2.7的Python 2.7.9端口{1}}模块。因此,我使用更简单的枚举形式:
enum
在这种情况下,使用class Color(object):
red = 1
green = 2
blue = 3
进行比较仍然可以吗?更一般地说,可以将已知在程序生命周期内不会发生变化的静态类变量与is
而不是is
进行比较,而不管它们的类型如何?
注意:我认为只有静态变量的名称才会用于赋值/比较,而不是它的值。
答案 0 :(得分:3)
x = 2
的{{1}}将评估x is Color.green
。
你应该吗? 否即可。首先,它没有概念上的意义 - 你真的关心它们是否是同一个确切的对象(身份,True
),或者它们是否具有相同的价值( 平等,is
)?如果值来自类本身以外的其他地方,例如,数据库或用户输入?另一方面,小整数的实习是一个实现细节,所以不应该依赖它。
更一般地说,可以将已知在程序生命周期内不会更改的静态类变量与
==
而不是is
进行比较,无论其类型如何?
否,因为这可能会失败,无论他们是“静态”:
==
答案 1 :(得分:1)
可能,因为CPython对[-5, ..., 256]
中的数字使用相同的地址(它们永远不会重新创建):
>>> (-5 + 0) is -5
True
>>> (-6 + 0) is -6
False
>>> (256 + 0) is 256
True
>>> (257 + 0) is 257
False
但它依赖于实施并不是一件好事。
为什么不使用==
?