Python: разумно ли использовать None в качестве словарного ключа?
Нет, похоже, работает как словарь, но мне интересно, не приведет ли это к неприятности позже. Например, это работает:
>>> x={'a':1, 'b':2, None:3}
>>> x
{'a': 1, None: 3, 'b': 2}
>>> x[None]
3
Фактические данные, с которыми я работаю, - это образовательные стандарты. Каждый стандарт связан с областью содержимого. Некоторые стандарты также связаны с подрайонами контента. Я хотел бы сделать вложенный словарь формы {contentArea:{contentSubArea:[standards]}}
. Некоторые из этих ключей contentSubArea будут None.
В частности, мне интересно, не приведет ли это к путанице, если я найду ключ, который не существует в какой-то момент или что-то непредвиденное.
Ответы
Ответ 1
Любое хешируемое значение является допустимым ключом словаря Python. По этой причине ни один из них не является вполне допустимым кандидатом. Там нет путаницы при поиске несуществующих ключей - присутствие None в качестве ключа не повлияет на возможность проверки наличия другого ключа. Пример:
>>> d = {1: 'a', 2: 'b', None: 'c'}
>>> 1 in d
True
>>> 5 in d
False
>>> None in d
True
Нет конфликта, и вы можете проверить его, как обычно. Это не должно вызывать проблем. Стандартная ассоциация Key-Value 1-to-1 все еще существует, поэтому вы не можете иметь несколько элементов в ключе None, но использование None в качестве ключа не должно представлять проблему самостоятельно.
Ответ 2
None
не является особенным каким-либо конкретным способом, это просто другое значение python. Единственное его отличие состоит в том, что это возвращаемое значение функции, которая не указывает никакого другого возвращаемого значения, а также является обычным значением по умолчанию (например, аргумент по умолчанию dict.get()
).
Вы не будете приводить к конфликтам во время выполнения с помощью такого ключа, но вы должны спросить себя, действительно ли это значимое значение для использования ключа. Часто полезно с точки зрения чтения кода и понимания того, что он делает, использовать назначенный экземпляр для специальных значений. Что-то вроде:
NoSubContent = SubContentArea(name=None)
{"contentArea":
{NoSubContent:[standards],
SubContentArea(name="Fruits"): ['apples', 'bananas']}}
Ответ 3
Вам нужны неприятности? здесь мы идем:
>>> json.loads(json.dumps({None:None}))
{u'null': None}
Так что, лучше держаться подальше от json, если вы используете None
в качестве ключа. Вы можете исправить это с помощью пользовательского (de/) сериализатора, но я бы посоветовал не использовать None
в качестве ключа в первую очередь.
Ответ 4
Мне кажется, чем больше, тем позже проблема. Если ваш процесс создает пары, а некоторые пары имеют ключ "Нет", он перезаписывает все предыдущие пары "Нет". Ваш словарь будет молча выкидывать значения, потому что у вас есть дубликаты None. Нет?
Ответ 5
Смешно, хотя даже это работает:
d = {None: 'None'}
In [10]: None in d
Out[10]: True
Ответ 6
Нет. Это только вызовет головные боли в будущем. Используйте фиктивный нуль вместо фактического нулевого значения, если у вас нет клавиши contentSubArea
.