Python: хранит ли указатель значения dict свой ключ? - PullRequest
2 голосов
/ 21 сентября 2009

Мне интересно, есть ли встроенный способ сделать это ... Возьмите этот простой код, например:

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

Я полагаю, что object_a просто указывает на objectA(), созданный в первой строке, и ничего не знает о словаре D, но мой вопрос: хранит ли Python ключ значения словаря? Есть ли способ получить ключ 'one', если у вас есть только переменная object_a (конечно, без зацикливания словаря)?

Если нет, я могу сохранить значение 'one' внутри objectA(), но мне просто любопытно, если Python уже хранит эту информацию.

Ответы [ 4 ]

7 голосов
/ 21 сентября 2009

Я думаю, что нет.

Рассмотрим случай добавления одного объекта в (большое) количество разных словарей. Python станет довольно дорогим, чтобы отследить это для вас, это будет стоить дорого для функции, не используемой большинством.

3 голосов
/ 21 сентября 2009

Отображение dict не является тривиально "обратимым", как вы описываете.

  1. Ключ должен быть неизменным. Он должен быть неизменным, чтобы его можно было хешировать для поиска и не подвергаться спонтанным изменениям.

  2. Значение не обязательно должно быть неизменным, оно не хешируется для быстрого поиска.

Вы не можете просто перейти от значения к ключу без (1) создания неизменяемого значения и (2) заполнения какого-либо другого вида отображения с помощью «обратного» значения -> отображение ключа.

2 голосов
/ 21 сентября 2009

Есть ли способ получить Ключ "один", если все, что у вас есть, это переменная object_a (без перебора словаря, конечно)?

Нет, Python не навязывает вам такую ​​почти бесполезную избыточность. Если objA - заводская функция:

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

и

b = objA()

так же, как

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

все приводят к точно таким же ссылкам в a, b и c, к точно эквивалентным объектам (если это то, что objA дает вам в первую очередь), без потери одного бита (ни в указанных объектах, ни в какой-либо избыточной и полностью гипотетической вспомогательной структуре) записать «это значение было / было значением в списке L и / или dict d для этих индекса / ключа» ((или индексов / ключей, поскольку, конечно, их может быть много) ).

0 голосов
/ 22 сентября 2009

Как уже говорили другие, для этого нет встроенного способа, так как он занимает память и обычно не требуется.

Если нет, я могу сохранить значение one в objectA (), но мне просто интересно, если Python уже хранит эту информацию.

Просто хотел добавить, что довольно просто добавить более общее решение, которое делает это автоматически. Например:

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

Эта функция просто встраивает каждый объект в словарь с помощью члена "dict_key", который является ключом словаря, используемого для хранения объекта.

Конечно, этот код может работать только один раз (т. Е. Запустить его в двух разных словарях, которые совместно используют объект, и элемент "dict_key" объекта будет перезаписан вторым словарем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...