Python的参数处理顺序定义得当吗?



我想知道我是否有函数

def f(*args):
    print(*args)

如果我这样运行,我是否可以保证处理论点的顺序?我知道C 不能保证这样的订单。

>>> d = {1:2, 3:4, 5:6, 7:8}
>>> f(d.pop(1), d.pop(3), {k:v for k, v in d.items()})
2 4 {5: 6, 7: 8}

如果参数是故障处理的,我们可能会得到

2 4 {1:2, 3:4, 5:6, 7:8}

2 4 {1:2, 5:6, 7:8}

2 4 {3:4, 5:6, 7:8}

这似乎有效,但是我不确定这只是Cpython还是Python标准的效果。我似乎无法找到有关此文档的文档。

*args将以您发送的顺序进行,这是由语言保证的。功能参数也从左到右评估,这是由语言保证的。Python必须对此做出一些的选择,否则对一个参数的评估可以突变另一个论点并导致未指定的行为。

您可以依靠问题中描述的行为:

2 4 {5: 6, 7: 8}

但是,请注意以下结果也是有效的Python输出。尽管由于有关dictint的某些实现细节,您不太可能在Cpython中看到它。

2 4 {7: 8, 5: 6}

与C和C 不同,Python保证对函数参数从左到右评估。您可以确定pop的呼叫将在DICE理解之前运行。

6.15。评估顺序

Python评估从左到右的表达式。请注意,在评估作业时,右侧 在左侧进行评估。

在以下几行中,表达式将在 后缀的算术顺序:

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

最新更新