以下两个陈述有什么区别?

时间:2016-06-03 07:15:28

标签: python

x = func(*(xa,) + args)
y = func(*((xc,) + args)) 

其中args是一个数组,函数定义是:

def func(lamb, data):
    # statements

我了解了*args,但我找不到这些行之间的确切差异。

1 个答案:

答案 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)