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
*的语义在不同的场景下会有一些理解上的差别,对于题中出现的几种
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