这在某种程度上是对为什么 Python 枚举中的可变值是同一个对象的后续内容?.
如果 an 的值Enum
是可变的(例如list
s 等),则可以随时更改这些值。Enum
我认为如果成员是按值检索的,这会带来一些问题,特别是如果有人无意中更改了Enum
他查找的值:
>>> from enum import Enum
>>> class Color(Enum):
black = [1,2]
blue = [1,2,3]
>>> val_1 = [1,2]
>>> val_2 = [1,2,3]
>>> Color(val_1)
<Color.black: [1, 2]>
>>> Color(val_2)
<Color.blue: [1, 2, 3]>
>>> my_color = Color(val_1)
>>> my_color.value.append(3)
>>> Color(val_2)
<Color.black: [1, 2, 3]>
>>> Color(val_1)
Traceback (most recent call last):
...
ValueError: [1, 2] is not a valid Color
我认为考虑到普通的 Python 习惯用法,这是可以的,这意味着用户可以使用可变变量作为他们的Enum
值,但只是为了了解他们可能打开的蠕虫罐头。
然而,这带来了第二个问题 - 因为您可以Enum
按值查找成员,并且该值可以是可变的,所以它必须通过 hashmap/ 以外的方式进行查找dict
,因为可变不能是key
这样的 a dict
。
Enum
将值限制为仅不可变类型以便按值查找可以用 a 来实现不是更有效(尽管被授予,不太灵活)dict
吗?