Разумно ли использовать None в качестве словарного ключа в Python? - PullRequest
46 голосов
/ 11 августа 2011

Ни один из них, похоже, не работает в качестве словарного ключа, но мне интересно, не приведет ли это позже к проблемам. Например, это работает:

>>> x={'a':1, 'b':2, None:3}
>>> x
{'a': 1, None: 3, 'b': 2}
>>> x[None]
3

Фактические данные, с которыми я работаю, - образовательные стандарты. Каждый стандарт связан с областью контента. Некоторые стандарты также связаны с подрайонами контента. Я хотел бы сделать вложенный словарь вида {contentArea:{contentSubArea:[standards]}}. Некоторым из этих ключей contentSubArea будет None.

В частности, мне интересно, приведет ли это к путанице, если я найду ключ, которого в какой-то момент не существует, или что-то непредвиденное.

Ответы [ 6 ]

54 голосов
/ 11 августа 2011

Любое хешируемое значение является допустимым ключом словаря Python. По этой причине, Ни один не является совершенно действительным кандидатом. Не возникает путаницы при поиске несуществующих ключей - присутствие None в качестве ключа не повлияет на возможность проверки наличия другого ключа. Пример:

>>> d = {1: 'a', 2: 'b', None: 'c'}
>>> 1 in d
True
>>> 5 in d
False
>>> None in d
True

Нет конфликта, и вы можете проверить его, как обычно. Это не должно вызывать у вас проблемы. Стандартное сопоставление «ключ-значение 1: 1» все еще существует, поэтому в ключе None не может быть нескольких элементов, но использование None в качестве ключа само по себе не должно создавать проблем.

8 голосов
/ 11 августа 2011

None не является чем-то особенным, это просто еще одно значение Python.Его единственное отличие состоит в том, что оно является возвращаемым значением функции, которая не указывает никакого другого возвращаемого значения, а также является общим значением по умолчанию (например, аргумент по умолчанию dict.get()).

Вы не будете вызывать конфликты во время выполнения при использовании такого ключа, но вам следует спросить себя, действительно ли это значение имеет значение для ключа.С точки зрения чтения кода и понимания того, что он делает, зачастую более полезно использовать назначенный экземпляр для специальных значений.Что-то вроде:

NoSubContent = SubContentArea(name=None)

{"contentArea": 
    {NoSubContent:[standards], 
     SubContentArea(name="Fruits"): ['apples', 'bananas']}}
6 голосов
/ 13 января 2016

Хочешь неприятностей?здесь мы идем:

>>> json.loads(json.dumps({None:None}))
{u'null': None}

Так что да, лучше держитесь подальше от json, если вы используете None в качестве ключа.Вы можете исправить это с помощью специального (de /) сериализатора, но я бы рекомендовал не использовать None в качестве ключа.

2 голосов
/ 24 апреля 2014

Мне кажется, чем больше проблема, тем позже.Если ваш процесс создает пары, а некоторые пары имеют клавишу «Нет», он перезапишет все предыдущие пары «Нет».Ваш словарь будет молча выбрасывать значения, потому что у вас есть дубликаты ключей None.Нет

0 голосов
/ 07 июля 2014

Забавно, хотя, даже это работает:

d = {None: 'None'}

In [10]: None in d
Out[10]: True
0 голосов
/ 11 августа 2011

Нет.Это только вызовет головные боли в будущем.Используйте фиктивный ноль вместо фактического ноля, когда у вас нет клавиши contentSubArea.

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