在为 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
为什么会这样?这是预期的行为还是错误?
注意: 我不打算以这种方式实际使用 Enum,我只是在尝试为 Enum 成员使用非标准值
最佳答案
来自 docs :
Given two members A and B with the same value (and A defined first), B is an alias to A. By-value lookup of the value of A and B will return A. By-name lookup of B will also return A:
>>> class Shape(Enum): ... square = 2 ... diamond = 1 ... circle = 3 ... alias_for_square = 2 ... >>> Shape.square <Shape.square: 2> >>> Shape.alias_for_square <Shape.square: 2> >>> Shape(2) <Shape.square: 2>
即使值是可变的,这也是通过相等来操作的。由于您为 black
和 blue
定义了相等的值,并且首先使用 black
,所以 blue
是 的别名黑色
.
关于python - 为什么 Python 枚举中的可变值是同一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40641213/