【发布时间】:2016-11-16 19:59:24
【问题描述】:
在为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 成员使用非标准值
【问题讨论】:
标签: python python-3.x enums identity