在Python中使用None作为字典键是否合理?

时间:2011-08-11 17:09:49

标签: python dictionary key

似乎无法作为字典键,但我想知道这是否会导致以后出现问题。例如,这有效:

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

我正在使用的实际数据是教育标准。每个标准都与内容区域相关联。一些标准也与内容子区域相关联。我想创建一个{contentArea:{contentSubArea:[standards]}}形式的嵌套字典。其中一些contentSubArea键将为None。

特别是,我想知道如果我找到一个在某些时候不存在的密钥,或者像这样的意外事件,这是否会导致混淆。

7 个答案:

答案 0 :(得分:53)

任何hashable值都是有效的Python Dictionary Key。因此,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作为键本身不应该产生问题。

答案 1 :(得分:7)

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

使用这样的密钥不会导致任何运行时冲突,但您应该问自己,这是否真的是用于密钥的有意义的值。从阅读代码和理解它的作用的角度来看,使用特定值的指定实例通常更有帮助。类似的东西:

NoSubContent = SubContentArea(name=None)

{"contentArea": 
    {NoSubContent:[standards], 
     SubContentArea(name="Fruits"): ['apples', 'bananas']}}

答案 2 :(得分:6)

你想要麻烦吗?我们走了:

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

所以,如果你使用None作为关键,最好远离json。您可以通过自定义(de /)序列化程序对此进行修补,但我建议不要首先使用None作为密钥。

答案 3 :(得分:2)

在我看来,较大的,后来的问题是这个。如果您的进程正在创建对,并且某些对具有“无”键,则它将覆盖所有先前的无对。你的字典会默默地抛出值,因为你有重复的无键。否?

答案 4 :(得分:1)

jsonify不支持带有None键的字典。

From Flask import jsonify

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

这将引发错误:
TypeError:“ NoneType”和“ str”的实例之间不支持“ <”

答案 5 :(得分:0)

有趣的是,即便如此:

d = {None: 'None'}

In [10]: None in d
Out[10]: True

答案 6 :(得分:-1)

没有。它只会在将来引起麻烦。当您没有contentSubArea密钥时,请使用虚拟null而不是实际null。