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

似乎没有一个字典的关键,但我想知道这是否会导致后来的麻烦。 例如,这工作:

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

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

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

任何可sorting的值是一个有效的Python字典键。 因此,没有一个完全有效的候选人。 查找不存在的密钥时不会出现混淆 – 无作为密钥的存在不会影响检查另一个密钥是否存在的能力。 例如:

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

没有冲突,你可以像正常一样testing它。 它不应该导致你的问题。 标准的1对1键值关联依然存在,所以你不能在None键中有多个东西,但是使用None作为键不应该自成一个问题。

None什么特别的方式,这只是另一个python值。 它唯一的区别在于它恰好是一个函数的返回值,它没有指定任何其他的返回值,它也恰好是一个通用的默认值(例如dict.get()的默认参数)。

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

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

你想麻烦? 开始了:

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

所以,如果你使用None作为关键,那么最好远离json。 您可以通过自定义(de /)序列化程序来修补此问题,但我build议不要将None作为关键字使用。

在我看来,较大的,后来的问题是这样的。 如果你的过程是创build对,而一些对有一个“无”键,那么它将覆盖所有以前的无对。 你的字典会默默地抛出值,因为你有重复的None键。 没有?

有趣的是,即使这样做:

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

不,这只会在未来引起头痛。 如果没有contentSubArea键,则使用虚拟空值而不是实际空值。