Python中使用None作为字典键合理吗?

问题描述 投票:0回答:6

似乎没有一个可以用作字典键,但我想知道这是否会导致以后出现麻烦。 例如,这有效:

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

我使用的实际数据是教育标准。 每个标准都与一个内容区域相关联。 一些标准还与内容子区域相关。 我想制作一个

{contentArea:{contentSubArea:[standards]}}
形式的嵌套字典。 其中一些 contentSubArea 键将为 None。

特别是,我想知道如果我寻找某个时候不存在的密钥或类似的意外情况是否会导致混乱。

python dictionary key
6个回答
101
投票

任何可哈希值都是有效的 Python 字典键。 因此,None 是一个完全有效的候选者。 查找不存在的键时不会产生混淆 - None 作为键的存在不会影响检查另一个键是否存在的能力。例如:

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

不存在冲突,可以正常测试。 它不应该给你带来问题。 标准的 1 对 1 键值关联仍然存在,因此 None 键中不能有多个内容,但使用 None 作为键本身不应该造成问题。


25
投票

你想找麻烦吗?我们开始吧:

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

所以,如果您确实使用

None
作为键,最好远离 JSON。您可以通过自定义序列化器/反序列化器修补此问题,但我建议首先不要使用
None
作为密钥。


9
投票

None
在任何特定方面都没有特殊之处,它只是另一个 python 值。 它唯一的区别是,它恰好是一个没有指定任何其他返回值的函数的返回值,并且它也恰好是一个常见的默认值(例如
dict.get()
的默认参数)。

使用这样的键不会导致任何运行时冲突,但您应该问自己这是否真的是用于键的“有意义”值。 从阅读代码和理解其作用的角度来看,使用指定实例来表示特殊值通常会更有帮助。 比如: NoSubContent = SubContentArea(name=None) {"contentArea": {NoSubContent:[standards], SubContentArea(name="Fruits"): ['apples', 'bananas']}}



4
投票

From Flask import jsonify def json_(): d = {None: 'None'} return jsonify(d)

这会引发错误:

类型错误:'
<' not supported between instances of 'NoneType' and 'str'


3
投票


0
投票

d = {None: 'None'} In [10]: None in d Out[10]: True

	
© www.soinside.com 2019 - 2024. All rights reserved.