2014-10-29 81 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