x = func(*(xa,) + args)
y = func(*((xc,) + args))
其中args是一个数组,函数定义是:
def func(lamb, data):
# statements
我了解了*args
,但我找不到这些行之间的确切差异。
答案 0 :(得分:5)
唯一的区别是额外的一组括号,一个使用xa
而另一个使用xc
,但即使这样做也没有太大的区别to the byte code,一看:
# python 2 needs to use dis.dis(compile("func(*(xa,)+args)","","eval"))
# to get same result, see http://stackoverflow.com/questions/12673074/how-should-i-understand-the-output-of-dis-dis
>>> dis.dis("func(*(xa,)+args)")
1 0 LOAD_NAME 0 (func)
3 LOAD_NAME 1 (xa)
6 BUILD_TUPLE 1
9 LOAD_NAME 2 (args)
12 BINARY_ADD
13 CALL_FUNCTION_VAR 0 (0 positional, 0 keyword pair)
16 RETURN_VALUE
>>> dis.dis("func(*((xc,)+args))")
1 0 LOAD_NAME 0 (func)
3 LOAD_NAME 1 (xc)
6 BUILD_TUPLE 1
9 LOAD_NAME 2 (args)
12 BINARY_ADD
13 CALL_FUNCTION_VAR 0 (0 positional, 0 keyword pair)
16 RETURN_VALUE
这是precedence的简单问题,加法优先于*
解包(CALL_FUNCTION_VAR是使用的确切字节码),因此添加括号不会改变任何内容,就像这里:
3 * 5 + 1
乘法将首先发生,因此在其周围添加括号:
(3 * 5) + 1
不会改变将要发生的事情。
另请注意,在解压缩参数时,您不必一起添加元组,您可以轻松完成:
func(xa, *args)
在不必将元组添加到一起的情况下完成相同的结果(当args
不是一个元组时,这将会起作用,因为你的版本会引发一个TypeError)