Python defaultdict returns None 获取时,尽管已使用默认值初始化

Python defaultdict returns None on get, despite being initialized with a default value

我正在尝试编写 Dijkstra 最短路径算法的一个变体。为此,我想将最短路径距离初始化为 math.inf,并为任何看不见的键返回此值。

我正在使用 defaultdict,初始化为 defaultdict(lambda:math.inf),希望为新密钥返回无限值。

但是,我看到在下面的示例中返回了 None 个值。

初始化:

shortest_paths = defaultdict(lambda:math.inf)
shortest_paths[k] = 0

print(f"Initial values for shortest_paths = {shortest_paths}")

这会打印:

Initial values for shortest_paths = defaultdict(<function Solution.networkDelayTime.<locals>.<lambda> at 0x1044818b0>, {2: 0})

通话:

print(f"n={n} and shortest_paths.get(n) = {shortest_paths.get(n)}")

这会打印:

n=1 and shortest_paths.get(n) = None

这最终导致 None 对象和整数值之间的比较,破坏了我的代码。

shortest_paths[n] = min(shortest_paths.get(n), shortest_paths.get(current) + dist)

导致:

TypeError: '<' not supported between instances of 'int' and 'NoneType'

我想弄清楚的是 defaultdict 的值是如何没有被初始化的。

粘贴在 REPL 上的这段代码运行良好。如果相关的话,我正在使用 VSCode。

defaultdict 的重点是您始终使用括号访问 -- .get(...) 保留其原始语义(继承自 dict):

>>> shortest_paths = defaultdict(lambda:math.inf)
>>> shortest_paths[5]
inf
>>> shortest_paths.get(5)
inf
>>> print(shortest_paths.get(6))
None