我想知道我是否有这个功能
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标准的影响,还是两者都没有。我似乎无法找到关于此的文档。
答案 0 :(得分:0)
*args
将按照您发送的顺序发出,这由语言保证。函数参数也是evaluated left to right,这由语言保证。 Python必须对此进行某些选择,否则对一个参数的评估可能会改变另一个参数并导致未指定的行为。
您可以依赖于您在问题中描述的行为:
2 4 {5: 6, 7: 8}
但是,请注意下面的结果也是一个有效的Python输出。由于有关dict
和int
的一些实施细节,您不太可能在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