我正在阅读以下 python 代码片段,但有些地方我不明白。 root 是一个自定义类,代表一个树节点。谁能解释为什么 root 的分配命令以这种方式工作?
while (p.val - root.val) * (q.val - root.val) > 0:
root = [root.left, root.right][p.val > root.val]
请您参考如下方法:
[root.left, root.right] 是一个包含 2 个值的列表。
p.val > root.val 是用作索引的 bool 值:值可以是 0 或 1。
所以这是一种避免(明确地)测试值的方法,只需根据 0 或 1 索引结果(但测试仍然存在)
虽然这看起来是个好主意,但在 Python 中这种构造的效率值得怀疑:它动态构建一个列表,然后通过索引访问它(使用边界检查),更不用说它必须同时评估两者root.left 和 root.right 无论结果如何(无短路)。
我认为使用以下三元表达式会更好:
root = root.right if p.val > root.val else root.left
它是显式的、短路的,并且不会创建/访问临时列表。
