代码之家  ›  专栏  ›  技术社区  ›  Jason Coon

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

  •  2
  • Jason Coon  · 技术社区  · 15 年前

    我想知道是否有一个内置的方法来做这件事…以这个简单的代码为例:

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

    我相信 object_a 只是指向 objectA() 在第一行创建,对字典一无所知 D 但我的问题是,python是否存储字典值的键?有办法拿到钥匙吗 'one' 如果你所拥有的只是变量 对象A (当然,不用翻字典)?

    如果没有,我可以存储值 “一” 里面 对象() 但是我很好奇python是否已经存储了这些信息。

    4 回复  |  直到 15 年前
        1
  •  7
  •   unwind    15 年前

    我想没有。

    考虑将单个对象添加到(大量)不同字典的情况。对于python来说,跟踪这一点会变得非常昂贵,对于大多数人都不使用的特性来说,这会花费很多钱。

        2
  •  3
  •   S.Lott    15 年前

    这个 dict 正如您所描述的,映射并不是一般的“可逆”。

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

    2. 该值不必是不可变的,也不必为快速查找而散列。

    如果没有(1)创建不可变的值,(2)使用“反向”值填充其他类型的映射,则不能简单地从值返回键。

        3
  •  2
  •   Alex Martelli    15 年前

    如果 你所拥有的只是变量对象 (没有翻阅字典, 当然)?

    不,python不会对您施加如此近乎无用的冗余。如果 objA 工厂是否可调用:

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

    b = objA()
    

    一样好

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

    所有的结果在 a , b c (如果这就是 奥贾 首先给你),没有一点浪费(既不在所说的对象中,也不在任何冗余和完全假设的辅助结构中)来记录“这是/曾经是列表L中的一个值和/或这些索引/键的dict d”(或索引/键,因为可能有很多)。

        4
  •  0
  •   Edan Maor    15 年前

    正如其他人所说,没有内置的方法来实现这一点,因为它占用了内存,通常不需要。

    如果没有,我可以将值'one'存储在objecta()中,但我只是好奇python是否已经存储了这些信息。

    只是想补充一下,应该很容易添加一个更通用的自动解决方案。例如:

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

    此函数只是将字典中的每个对象嵌入一个成员“dict_key”,它是用于存储对象的字典密钥。

    当然,此代码只能工作一次(即,在共享一个对象的两个不同字典上运行此代码,对象的“dict-key”成员将被第二个字典覆盖)。