我正在阅读以下python代码片段,有些东西我不明白。 root是一个自定义的类,表示一个树节点。任何人都可以解释为什么root的赋值命令以这种方式工作?
while (p.val - root.val) * (q.val - root.val) > 0:
root = [root.left, root.right][p.val > root.val]
答案 0 :(得分:6)
[root.left, root.right]
是2个值的list
。
p.val > root.val
是一个用作索引的布尔值:value可以是0或1。
因此,这是一种避免(明确)测试值的方法,只需根据0
或1
对结果进行索引(但测试仍在那里)
虽然它可能看起来是一个好主意,但Python中构造的效率是可疑的:它动态地构建一个列表然后通过索引访问它(带边界检查),更不用说它必须同时评估它们root.left
和root.right
无论结果如何(无短路)。
我认为你最好使用下面的三元表达式:
root = root.right if p.val > root.val else root.left
它是明确的,短路的,并且不会创建/访问临时列表。