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

2024-04-20 13:44:35 发布

您现在位置:Python中文网/ 问答频道 /正文

似乎没有一把钥匙是字典的钥匙,但我想知道这是否会导致以后的麻烦。例如,它可以工作:

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

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

特别是,我想知道,如果我寻找一个在某个点上不存在的密钥,或是一些意想不到的东西,这是否会导致混淆。


Tags: 数据none区域内容标准字典密钥形式
3条回答

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

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

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

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

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

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

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

使用这样的键不会导致任何运行时冲突,但您应该扪心自问,对于键来说,这是否真的是一个有意义的值。从阅读代码和理解代码的作用的角度来看,为特殊值使用指定的实例通常更有帮助。类似于:

NoSubContent = SubContentArea(name=None)

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

相关问题 更多 >