Во время экспериментов с разными типами значений для членов 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
Однако, если я определяю значения как идентичные списки, каждое значение элемента похоже будет тем же самым объектом, и, таким образом, любая мутация одного значения элемента влияет на всех членов:
>>> 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
ведет себя так? Является ли это предполагаемым поведением или это ошибка?
ПРИМЕЧАНИЕ: Я не планирую фактически использовать Enums таким образом, я просто экспериментировал с использованием нестандартных значений для членов Enum