前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 可变参数 *args **kwargs 的再了解

Python 可变参数 *args **kwargs 的再了解

作者头像
Devops海洋的渔夫
发布2019-06-02 13:53:26
4780
发布2019-06-02 13:53:26
举报
文章被收录于专栏:Devops专栏Devops专栏

*args **kwargs 有什么用处?

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

示例如下:

代码语言:javascript
复制
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="斗地主")

执行如下:

代码语言:javascript
复制
[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 的元组中?

运行如下:

代码语言:javascript
复制
[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方法中呢?

代码语言:javascript
复制
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中,会有上面样的结果呢? 运行一下看看:

代码语言:javascript
复制
[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呢?

解决方法

代码语言:javascript
复制
    #传入参数到test2
    test2(a,b,*args,**kwargs)

运行结果如下:

代码语言:javascript
复制
[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中。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • *args **kwargs 有什么用处?
  • 疑问:能够在test1中,将args和kwargs的参数,再次写入另一个test2方法中呢?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档