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
我正在尝试编写 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