在为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

然而,如果我将值定义为相同的列表,每个成员的值似乎都是相同的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

推荐答案

docs人中:

给定两个具有相同值的成员A和B(首先定义A),B是A的别名.按值查找A和B的值将返回A.按名称查找B也将返回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开头,blueblack的别名.

Python-3.x相关问答推荐

Pandas 数据帧断言等同于NaN

在循环中使用Print&S结束参数时出现奇怪的问题

Pandas 插入的速度太慢了.对于跟踪代码,什么是更快的替代方案?

将两列的乘积连续添加到一列的累积和中

如何将 WebDriver 传输到导入的测试?

如何在类中的函数(以 self 作为第一个参数)中使用递归

Pandas 窗口聚合两个排序表

获取字符串中的两个工作日之间的差异

如何在两个矩阵的比较中允许任何列的符号差异,Python3?

Python:如何从句子/段落中提取地址(非正则表达式方法)?

使用一周的特定第一天将每日日期转换为每周

Await Future 来自 Executor:Future 不能在await表达式中使用

python tkInter 浏览文件夹按钮

python3:字节与字节数组,并转换为字符串和从字符串转换

Python 3 list(dictionary.keys()) 引发错误.我究竟做错了什么?

pysftp vs. Paramiko

tensorflow 中 numpy.newaxis 的替代方案是什么?

在 Python 3 中使用 unittest.mock 修补 input()

python setup.py egg_info mysqlclient

是否可以在每个路由的基础上限制 Flask POST 数据大小?