Python:dict值指针存储它的键吗?

时间:2009-09-21 13:09:44

标签: python dictionary

我想知道是否有内置的方法来执行此操作...例如,使用这个简单的代码:

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

我相信object_a只是指向第一行创建的objectA(),对字典D一无所知,但我的问题是,Python存储了密钥吗?字典价值?有没有办法获得密钥'one'如果您拥有的是变量object_a(当然没有循环遍历字典)?

如果没有,我可以在'one'内存储值objectA(),但我很好奇Python是否已存储该信息。

4 个答案:

答案 0 :(得分:7)

我认为没有。

考虑将单个对象添加到(大量)不同字典的情况。 Python为你追踪它会变得非常昂贵,对于大多数人没有使用的功能来说会花费很多。

答案 1 :(得分:3)

dict映射并非如您所描述的那样“可逆”。

  1. 密钥必须是不可变的。它必须是不可变的,以便它可以进行散列以便查找,而不会遭受自发的变化。

  2. 该值不必是不可变的,不进行哈希以便快速查找。

  3. 如果没有(1)创建不可变值,并且(2)使用“反转”值填充其他类型的映射,则不能简单地从值返回密钥 - >键映射。

答案 2 :(得分:2)

  

有没有办法让钥匙'一'如果   你所拥有的只是变量object_a   (没有循环字典,   当然)?

不,Python没有给你带来这种近乎无用的冗余。如果objA是工厂可调用的:

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

b = objA()

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

所有与abc完全相同的引用都会产生完全相同的对象(如果这是objA首先给出的内容),没有一点浪费(既不在所述对象中也不在任何冗余和完全假设的辅助结构中)来记录“这是/列表L中的值和/或这些索引/键上的字典”((或索引/键)因为cource可能有很多))。

答案 3 :(得分:0)

就像其他人所说的那样,没有内置的方法可以做到这一点,因为它占用了内存并且通常不需要。

  

如果没有,我可以在objectA()中存储值'one',但我只是好奇Python是否已存储该信息。

只是想补充一点,添加更通用的解决方案应该很容易实现。例如:

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

这个函数只是用字符“dict_key”嵌入字典中的每个对象,这是用于存储对象的字典键。

当然,这段代码只能工作一次(即,在共享一个对象的两个不同的字典上运行它,并且第二个字典会覆盖对象的“dict_key”成员)。