Python赋值命令语法

yuh*_*ngd 1 python grammar variable-assignment

我正在阅读以下python代码片段,有一些我不明白的东西.root是一个自定义的类,表示一个树节点.任何人都可以解释为什么root的赋值命令以这种方式工作?

   while (p.val - root.val) * (q.val - root.val) > 0:
        root = [root.left, root.right][p.val > root.val]
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 6

[root.left, root.right]list2个值.

p.val > root.val 是一个用作索引的布尔值:value可以是0或1.

因此,它是一种避免(显式)测试值的方法,只需根据01(但测试仍在那里)对结果进行索引

虽然它可能看起来是一个好主意,但Python中构造的效率是可疑的:它动态地构建一个列表然后通过索引访问它(带边界检查),更不用说它必须评估两者root.leftroot.right任何结果可能是(没有短路).

我认为使用以下三元表达式会更好:

root =  root.right if p.val > root.val else root.left
Run Code Online (Sandbox Code Playgroud)

它是显式的,短路的,并且不会创建/访问临时列表.

  • 这不是一个困扰我的列表的构造(在Python中真的是一个微不足道的开销,除非它在一些深度嵌套的循环中我不打扰优化它).真正困扰我的是它不会对`root.right`和`root.left`进行短路评估 (2认同)