Python赋值命令语法
Python assignment command grammar
我正在阅读以下 python 代码片段,但有些地方我不明白。 root 是一个自定义的 class 代表一个树节点。谁能解释为什么 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 个值的 list
。
p.val > root.val
是用作索引的布尔值:值可以是 0 或 1。
所以这是一种避免(显式)测试值的方法,只需根据 0
或 1
索引结果(但测试仍然存在)
虽然这看起来是个好主意,但在 Python 中构建的效率值得怀疑:它动态构建一个列表,然后通过索引访问它(使用边界检查),更不用说它必须评估 root.left
和 root.right
无论结果如何(无短路)。
我认为你最好使用以下三元表达式:
root = root.right if p.val > root.val else root.left
它是明确的、短路的,并且不会创建/访问临时列表。
我正在阅读以下 python 代码片段,但有些地方我不明白。 root 是一个自定义的 class 代表一个树节点。谁能解释为什么 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 个值的 list
。
p.val > root.val
是用作索引的布尔值:值可以是 0 或 1。
所以这是一种避免(显式)测试值的方法,只需根据 0
或 1
索引结果(但测试仍然存在)
虽然这看起来是个好主意,但在 Python 中构建的效率值得怀疑:它动态构建一个列表,然后通过索引访问它(使用边界检查),更不用说它必须评估 root.left
和 root.right
无论结果如何(无短路)。
我认为你最好使用以下三元表达式:
root = root.right if p.val > root.val else root.left
它是明确的、短路的,并且不会创建/访问临时列表。