在Python中使用None作为字典键合理吗?
看起来没有什么能作为字典的键,但我在想这样做以后会不会带来麻烦。例如,这段代码是可以运行的:
>>> x={'a':1, 'b':2, None:3}
>>> x
{'a': 1, None: 3, 'b': 2}
>>> x[None]
3
我现在处理的数据是教育标准。每个标准都和一个内容领域相关联。有些标准还和内容的子领域相关联。我想创建一个嵌套字典,格式是 {内容领域:{内容子领域:[标准]}}
。其中一些内容子领域的键可能是 None。
我特别想知道,如果我在某个时候查找一个不存在的键,会不会造成混淆,或者出现一些意想不到的情况。
6 个回答
9
None
在 Python 中并没有什么特别之处,它只是一个普通的值。它唯一的特点是,当一个函数没有指定其他返回值时,它会返回 None
,而且它也是一个常见的默认值(比如 dict.get()
的默认参数就是它)。
使用这样的键不会导致运行时冲突,但你应该问问自己,这样的值作为键是否真的有意义。从阅读代码和理解代码的角度来看,使用专门的实例来表示特殊值通常会更有帮助。比如:
NoSubContent = SubContentArea(name=None)
{"contentArea":
{NoSubContent:[standards],
SubContentArea(name="Fruits"): ['apples', 'bananas']}}
24
你想惹麻烦吗?那就来吧:
>>> json.loads(json.dumps({None:None}))
{u'null': None}
所以,最好不要在使用 None
作为键的时候碰触 JSON。你可以通过自定义的(反)序列化器来解决这个问题,但我还是建议你一开始就不要把 None
当作键来用。
100
在Python中,任何可以被哈希的值都可以作为字典的键。因此,None(空值)也是一个完全有效的选择。当你查找一个不存在的键时,使用None作为键不会造成混淆,因为它不会影响你检查其他键是否存在的能力。举个例子:
>>> d = {1: 'a', 2: 'b', None: 'c'}
>>> 1 in d
True
>>> 5 in d
False
>>> None in d
True
没有冲突,你可以像平常一样进行测试。这不会给你带来问题。标准的一对一键值关系仍然存在,所以你不能在None这个键下放多个值,但单独使用None作为键本身不会有问题。