2014-10-29 85 views
-1

我有一个数据结构,它由任意嵌套的列表,整数和字符串组成。例如:python中的递归'不可变'函数

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

我想指数使用这样的对象dict,但我可以因为Python抱怨他们不并不是一成不变的(这是真的)。我很惊讶地发现,似乎没有一个通用的递归“make immutable”函数。这样的功能是否存在?有没有充分的理由为什么不?我应该如何解决这个问题?

+1

列表的不可变等价物是一个元组。转换没有通用功能,但写起来很容易。 – jonrsharpe 2014-10-29 14:40:29

回答

1

这是一个非常不寻常和笨重的数据结构,想用作字典键,并且让我怀疑这是否是XY problem。对于您指定的特定类型的结构,只包含列表(可变)和字符串和整数(不可变),将所有列表转换为元组的递归函数很简单:

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) 

有冷冻任意可变对象无解,但。几年前,针对Python的freeze protocol被提出并被拒绝,但即使它已被接受,你也不得不依赖于你可能遇到的每个可变对象实现__freeze__()方法。

+0

谢谢。 我确切的问题是,我有一个现有的函数,它采用我描述的数据结构(实际上它代表一棵树),执行昂贵的计算(可能需要10分钟),并返回结果。 这个函数是有效的 - 它总是返回给定一个特定输入的相同输出。因此,一个明显的事情就是将其包装在缓存中,以存储以前的调用及其返回值。对我来说显而易见的(对我来说)存储这个缓存的方法是一个字典,因此需要我的数据结构的不可变表示。 – 2014-11-03 13:35:42