使用分号语法了解评估和执行顺序
Understanding the evaluation and execution order with semicolon syntax
我已经从 那里学到了一些关于 FFL 分号的知识。然而,目前还不清楚他们执行的评估或执行顺序是什么。所以这是一个更具体的例子:
[ expr_a, expr_b ; expr_c, expr_d ; expr_e, expr_f ]
以上代码的执行顺序应该是怎样的?在我看来,应该是:
- 评估 a 和 b
- 执行a,执行b
- 评估 c 和 d
- 执行c,执行d
- 评估 e 和 f
- 执行e,执行f
现在让我们假设 expr_b = add(test_list, ['b saw ' + str(test_list)])
和所有其他表达式类似。那么test_list
的最终内容是什么?
在我看来,应该是:
a saw []
b saw []
c saw [a saw [], b saw []]
d saw [a saw [], b saw []]
e saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw [a saw [], b saw []]]
f saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw [a saw [], b saw []]]
请解释为什么不是这样。
首先,您可能不想完全像这样编写代码。一般来说,分号的优先级很低,但列表字面量不是运算符,代码如下所示:
[a, (b; c), (d; e), f]
这意味着您将并行启动四个命令管道(尽管其中两个只有一个成员)。它将评估 a
、b
、d
、f
。然后它会执行a
的结果,然后是b
的结果。执行 b
将触发命令管道中的下一步,因此它将评估并执行 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 []
我已经从
[ expr_a, expr_b ; expr_c, expr_d ; expr_e, expr_f ]
以上代码的执行顺序应该是怎样的?在我看来,应该是:
- 评估 a 和 b
- 执行a,执行b
- 评估 c 和 d
- 执行c,执行d
- 评估 e 和 f
- 执行e,执行f
现在让我们假设 expr_b = add(test_list, ['b saw ' + str(test_list)])
和所有其他表达式类似。那么test_list
的最终内容是什么?
在我看来,应该是:
a saw []
b saw []
c saw [a saw [], b saw []]
d saw [a saw [], b saw []]
e saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw [a saw [], b saw []]]
f saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw [a saw [], b saw []]]
请解释为什么不是这样。
首先,您可能不想完全像这样编写代码。一般来说,分号的优先级很低,但列表字面量不是运算符,代码如下所示:
[a, (b; c), (d; e), f]
这意味着您将并行启动四个命令管道(尽管其中两个只有一个成员)。它将评估 a
、b
、d
、f
。然后它会执行a
的结果,然后是b
的结果。执行 b
将触发命令管道中的下一步,因此它将评估并执行 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 []