python - 为什么 Python 枚举中的可变值是同一个对象?

标签 python python-3.x enums identity

在为 Enum 成员尝试不同的值类型时,我发现当值可变时会出现一些奇怪的行为。

如果我将 Enum 的值定义为不同的列表,则成员的行为仍然类似于 Enum 值是典型的不可变类型(如 strint,即使我可以更改成员的值以使两个 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>

即使值是可变的,这也是通过相等来操作的。由于您为 blackblue 定义了相等的值,并且首先使用 black,所以 blue 的别名黑色.

关于python - 为什么 Python 枚举中的可变值是同一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40641213/

相关文章:

python - WxPython 将选择转换为数值 TypeError

python - 与特殊值交织的排列

enums - 如何根据当前枚举值选择一个有限制的随机枚举值?

python - 如何使用 Humanize 在 Django 中显示 "This many months ago"?

python - 将元组展开为半重复对

python - NLTK 文档聚类 : no terms remain after pruning?

python - 如何将复数从 python numpy 传递到 c(目前正在尝试使用 SWIG)

python-3.x - pydub.AudioSegment 在从 numpy.ndarray 加载时弄乱了音频数据

c++ - 枚举声明点

java - 我正在制作一个安全的、编译时的 String.format(...) 等价物。问题仍然存在