Python:字典的值指针会存储其键吗?

2 投票
4 回答
2593 浏览
提问于 2025-04-15 14:28

我在想,Python有没有内置的方法可以做到这一点……比如说,看看这段简单的代码:

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

我认为 object_a 只是指向第一行创建的 objectA(),并不知道字典 D 的存在。我的问题是,Python会存储字典值的键吗?如果我只有变量 object_a,有没有办法获取键 'one'(当然,不是通过遍历字典)?

如果没有的话,我可以把值 'one' 存在 objectA() 里面,但我只是好奇Python是否已经存储了这些信息。

4 个回答

2

有没有办法在只拥有变量 object_a 的情况下,获取键 'one' 呢?当然,不想通过循环字典来实现。

没有,Python 不会给你这种几乎没用的多余限制。如果 objA 是一个可以调用的工厂:

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

而且

b = objA()

同样的

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

这些都会在 abc 中产生完全相同的引用,指向完全等价的对象(如果 objA 最开始给你的是这些),而且没有一点浪费(无论是在这些对象上,还是在任何冗余的、完全假设的辅助结构上)来记录“这是/曾经是列表 L 和/或字典 d 中的某个值,位于这些索引/键” (当然,可能有很多索引/键)。

3

你说的这个dict映射并不是那么简单就能“反转”的。

  1. 键(key)必须是不可变的。也就是说,键不能随便改变,这样才能被用来快速查找,不会出现意外的变化。

  2. 值(value)可以是可变的,因为它不需要被哈希(hash)来快速查找。

所以,你不能仅仅通过值回到键,必须先(1)创建一个不可变的值,然后(2)用“反转”的值到键的映射来填充其他类型的映射。

7

我觉得不行。

想象一下,如果要把一个对象添加到很多不同的字典里,Python要为你跟踪这些信息,那就会变得非常耗费资源。这项功能大多数人都用不到,所以这样做的成本会很高。

撰写回答