python是否有一个明确定义的参数处理顺序?

时间:2017-02-16 19:17:41

标签: 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标准的影响,还是两者都没有。我似乎无法找到关于此的文档。

2 个答案:

答案 0 :(得分:0)

*args将按照您发送的顺序发出,这由语言保证。函数参数也是evaluated left to right,这由语言保证。 Python必须对此进行某些选择,否则对一个参数的评估可能会改变另一个参数并导致未指定的行为。

您可以依赖于您在问题中描述的行为:

2 4 {5: 6, 7: 8}

但是,请注意下面的结果也是一个有效的Python输出。由于有关dictint的一些实施细节,您不太可能在CPython中看到它。

2 4 {7: 8, 5: 6}

答案 1 :(得分:0)

与C和C ++不同,Python guarantees that function arguments are evaluated left to right。您可以确保在词典理解之前pop调用将会运行。

  

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