python 中的 *args 原理?

  • 提问时间: 3周前
  • 关注数: 0 / 浏览数: 18 / 回答数: 1
args = (1,2,4)
def test_args_kwargs(arg1, arg2, arg3):
  print("arg1:", arg1)
  print("arg2:", arg2)
  print("arg3:", arg3)
test_args_kwargs(*args)

这种写法能够正常运行,但以下这种却不行。

args = (1,2,4)
a,b,c = *args

按理来说,* 具备解包功能,两种赋值的方式应该相同的才对吧?而另一种赋值方式,竟然是可以行。

args = [1,2,4]
a,*b,c = args
小花花
3周前提问
1 个回答
  • 董俊俊

    *的语义在不同的场景下会有一些理解上的差别,对于题中出现的几种
    1.为什么a,b,c = *args不可以 a,*b,c = args可以?
    因为args不一定要平均分割 如果*放在被操作数上 会导致 a,*b = *args 这样的冗余语法 所以这时候放在左边是最简单的

    2.a = *args,
    args并不是解包赋值给a,而是args解包后和后面元素组成一个tuple再赋值给a

    3.为什么test_args_kwargs(*args)可以?
    函数的局部变量表就是一个tuple,对于test(a,b,c)需要先把栈中的a b c 组成一个tuple,而test(*args) 则会直接使用args这个tuple,如果args不是tuple 那还是需要先创建tuple

撰写答案
  • 相似问题