2009-09-21 70 views
2

我不知道是否有一個內置的方式做到這一點...拿這個簡單的代碼,例如:Python:字典值指針是否存儲密鑰?

D = {'one': objectA(), 'two': objectB(), 'three': objectC()} 
object_a = D['one'] 

我相信object_a在第一行創建的objectA()只是指指點點,對字典D一無所知,但我的問題是,Python是否存儲了字典值的Key?有沒有辦法獲得密鑰'one',如果你只有變量object_a(當然,沒有循環字典)?

如果不是,我可以將值'one'存儲在objectA()之內,但我只是好奇,如果Python已經存儲了該信息。

回答

7

我覺得沒有。

考慮將單個對象添加到(大量)不同字典的情況。對於Python來說,追蹤它會變得非常昂貴,對於大多數人未使用的功能來說,這會花費很多。

3

如您所描述的,映射並不平凡「可逆」。

  1. 該鍵必須是不可變的。它必須是不可變的,以便它可以被哈希來查找而不會遭受自發的變化。

  2. 該值不一定是不可變的,它不會被快速查找散列。

你不能簡單地從價值回去鍵無(1)創建一個不可變的值和(2)填充一些其他類型的映射與「逆轉」的價值 - >鍵映射。

2

有沒有辦法拿到鑰匙「一」,如果 你已經是變量object_a (不遍歷字典,當然 )?

不,Python不會對您造成這種幾乎沒有用處的冗餘。如果objA是一個工廠調用:

d = {'zap': objA()} 
a = d['zap'] 

b = objA() 

一樣好

L = [objA()] 
c = L[0] 

所有結果恰好在abc同一種參考,以完全相同的對象(如果這就是objA首先給你的東西),沒有一點浪費(既不是我n表示這些對象,也不在任何多餘且完全假設的輔助結構中)記錄「這是/在列表L中的值和/或在這些索引/鍵處的字典」((或者索引/鍵因爲源可能有很多) )。

0

和其他人一樣,沒有固定的方式來做到這一點,因爲它佔用了內存並且通常不需要。

如果不是,我可以在objectA()中存儲值'one',但我只是好奇,如果Python已經存儲該信息。

只是想補充說,它應該很容易添加一個更自動的解決方案。例如:

def MakeDictReversible(dict): 
for k, v in dict.iteritems(): 
    v.dict_key = k 

該函數只是嵌入在具有成員「dict_key」,這是用於存儲該對象的字典鍵的字典中的每個對象。

當然,這段代碼只能工作一次(即在共享一個對象的兩個不同的字典上運行這個代碼,並且該對象的「dict_key」成員將被第二個字典覆蓋)。