Python 可变参数 *args **kwargs 的再了解(python编程)

网友投稿 440 2022-08-26


Python 可变参数 *args **kwargs 的再了解(python编程)

仅用学习参考

*args **kwargs 有什么用处?

首先需要知道,有时候参数再传入的时候,是无法确定的。 例如多重继承的情况。

示例如下:

def test1(a,b,*args,**kwargs): print("a = %s " % a) print("b = %s " % b) print("args = " , args) print("kwargs = " , kwargs)test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")

执行如下:

[root@server01 test]# python3 test3.py a = 11 b = 22 args = (33, 44, 55, 66)kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}[root@server01 test]#

可以从上面的结果来看,args可以把多余的数字放入一个元组中,而后面的则被kwargs放入字典中。

考虑一下,如果在最后再写上一些数字,不能形成键值对的,会不会报错呢?还是直接陆续加入到 args 的元组中?

运行如下:

[root@server01 test]# python3 test3.py File "test3.py", line 8 test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主",77) ^SyntaxError: positional argument follows keyword argument[root@server01 test]#

果然报错了。 说明,当开始形成dict字典开始,后面就不能再次放非键值对的参数了,不然无法形成字典就会报错的。

疑问:能够在test1中,将args和kwargs的参数,再次写入另一个test2方法中呢?

def test2(a,b,*args,**kwargs): print("======== this is test2 =========") print("a = %s " % a) print("b = %s " % b) print("args = " , args) print("kwargs = " , kwargs)def test1(a,b,*args,**kwargs): print("a = %s " % a) print("b = %s " % b) print("args = " , args) print("kwargs = " , kwargs) #传入参数到test2 test2(a,b,args,kwargs)test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")

从上面的代码来看,在test1的方法中,直接将args和kwargs传递到test2中,会有上面样的结果呢? 运行一下看看:

[root@server01 test]# python3 test3.py a = 11 b = 22 args = (33, 44, 55, 66)kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}======== this is test2 =========a = 11 b = 22 args = ((33, 44, 55, 66), {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'})kwargs = {}[root@server01 test]#

可以看到test1中的kwargs的内容全部写入到test2的args的元组中了。​​​args = ((33, 44, 55, 66), {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'})​​​ 好了,疑问就来了。 能否就按照原来args和kwargs原本的参数写入test2呢?

解决方法

#传入参数到test2 test2(a,b,*args,**kwargs)

运行结果如下:

[root@server01 test]# python3 test3.py a = 11 b = 22 args = (33, 44, 55, 66)kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}======== this is test2 =========a = 11 b = 22 args = (33, 44, 55, 66)kwargs = {'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}[root@server01 test]#

那么为什么会这样呢? 因为在test1中,使用args的时候,变量就是 ​​​(33, 44, 55, 66)​​​,当使用kwargs的时候,变量就是​​{'fatboss': {'name': '胖子老板'}, 'hobby': '斗地主'}​​​ 那么此时,已经改变了原来的传入变量​​test1(11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主")​​ 只有将 ​​11,22,33,44,55,66, fatboss={"name":"胖子老板"},hobby="斗地主"​​ 传入test2 结果才是正确的。

而​​*args​​​和​​**kwargs​​就是原封不动地将原来的传入值再次传入test2中。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python property属性 - 将方法转化为变量的故事(python能做什么)
下一篇:Java项目中获取路径的绝对路径问题和相对路径问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~