代码之家  ›  专栏  ›  技术社区  ›  Patrick Parker

用分号语法理解计算和执行顺序

  •  0
  • Patrick Parker  · 技术社区  · 6 年前

    我已经从我的 previous question . 然而,仍然不清楚它们执行的评估或执行顺序。下面是一个更具体的例子:

     [ expr_a, expr_b ; expr_c, expr_d ; expr_e, expr_f ]
    

    上述代码的执行顺序应该是什么?在我看来,应该是:

    1. 评估A&B
    2. 执行A,执行B
    3. 评估C&D
    4. 执行C,执行D
    5. 评估E&F
    6. 执行e,执行f

    现在让我们想象一下 expr_b = add(test_list, ['b saw ' + str(test_list)]) 所有其他表达式都是类似的。那么最后的内容是什么 test_list ?

    在我看来,应该是:

    锯子

    B锯[]

    C锯[A锯[],B锯[]

    D锯[A锯[],B锯[]

    E锯[A锯[]、B锯[]、C锯[A锯[]、B锯[]、D锯[A锯[]、B锯[]]

    F锯[A锯[]、B锯[]、C锯[A锯[]、B锯[]、D锯[A锯[]、B锯[]]

    请解释为什么不是这样。

    1 回复  |  直到 5 年前
        1
  •  3
  •   Denivarius    6 年前

    首先,您可能不想完全这样编写代码。通常,分号的优先级很低,但列表文本不是运算符,代码如下所示:

    [a, (b; c), (d; e), f]

    这意味着您将并行启动四个命令管道(尽管其中两个管道只有一个成员)。它将评估 a , b , d , f . 然后执行 ,然后是 . 正在执行 将触发命令管道中的下一步,因此它将计算并执行 c . 然后执行 D ,然后评估和执行 e ,最后执行 f .

    所以:

    a saw []
    b saw []
    c saw [a saw [], b saw []]
    d saw []
    e saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw []]
    f saw []
    
    推荐文章