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

jap*_*hyr 51 python dictionary key

似乎没有一个作为字典键,但我想知道这是否会导致以后的麻烦.例如,这有效:

>>> x={'a':1, 'b':2, None:3}
>>> x
{'a': 1, None: 3, 'b': 2}
>>> x[None]
3
Run Code Online (Sandbox Code Playgroud)

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

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

g.d*_*d.c 59

任何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
Run Code Online (Sandbox Code Playgroud)

没有冲突,你可以像平常一样进行测试.它不应该导致你的问题.标准的1对1键值关联仍然存在,因此您在None键中不能有多个内容,但使用None作为键不应该自己造成问题.


Sin*_*ion 8

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

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

NoSubContent = SubContentArea(name=None)

{"contentArea": 
    {NoSubContent:[standards], 
     SubContentArea(name="Fruits"): ['apples', 'bananas']}}
Run Code Online (Sandbox Code Playgroud)


Mac*_*ski 6

你想要麻烦吗?开始了:

>>> json.loads(json.dumps({None:None}))
{u'null': None}
Run Code Online (Sandbox Code Playgroud)

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