在python中递归'Make Immutable'函数

时间:2014-10-29 14:33:37

标签: python python-3.x immutability

我有一个数据结构,由列表,整数和字符串组成,并且是嵌套的。例如:

[ "data", [ 1, "file", [], [1,2] ], 3 ]

我想使用这样的对象索引dict,但我不能因为python抱怨它们不是不可变的(这是真的)。我很惊讶地发现,它似乎并不是一种通用的递归方法,而且它是不可变的。功能。这样的功能存在吗?有没有理由不这样做?我应该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

这是一个非常不寻常和笨拙的数据结构,想要用作字典键,让我想知道这是否是XY problem

将观察结果留给一方......对于您指定的特定类型的结构,只包含列表(可变)和字符串以及整数(不可变),将所有列表转换为元组的递归函数非常简单:< / p>

def tuplify(value):
    if isinstance(value, list):
        return tuple(tuplify(x) for x in value)
    else:
        return value

......并按预期工作:

>>> tuplify(['data', [1, 'file', [], [1, 2]], 3])
('data', (1, 'file', (), (1, 2)), 3)

但是,没有办法冻结任意可变对象。几年前,提出并拒绝了freeze protocol的Python,但即使它被接受,你也不得不依赖于每个可变对象,你可能会遇到实现__freeze__()方法的问题。它起作用。