在为Enum
个成员试验不同的值类型时,我发现当值是可变的时,会出现一些奇怪的行为.
如果我将Enum
的值定义为不同的列表,那么当Enum
个值是典型的不可变类型(如str
或int
)时,成员的行为仍然类似,尽管我可以更改成员的值,以便两个Enum
成员的值相同:
>>> class Color(enum.Enum):
black = [1,2]
blue = [1,2,3]
>>> Color.blue is Color.black
False
>>> Color.black == Color.blue
False
>>> Color.black.value.append(3)
>>> Color.black
<Color.black: [1, 2, 3]>
>>> Color.blue
<Color.blue: [1, 2, 3]>
>>> Color.blue == Color.black
False
>>> Color.black.value == Color.blue.value
True
然而,如果我将值定义为相同的列表,每个成员的值似乎都是相同的object,因此一个成员值的任何Mutations 都会影响所有成员:
>>> class Color(enum.Enum):
black = [1,2,3]
blue = [1,2,3]
>>> Color.blue is Color.black
True
>>> Color.black == Color.blue
True
>>> Color.black.value.append(4)
>>> Color.black
<Color.black: [1, 2, 3, 4]>
>>> Color.blue
<Color.black: [1, 2, 3, 4]>
>>> Color.blue == Color.black
True
为什么Enum
人会这样?这是预期的行为还是一个bug?
NOTE: I'm not planning on actually using Enums this way, I was simply experimenting with using non-standard values for Enum members