为了账号安全,请及时绑定邮箱和手机立即绑定

这里为什么需要定义k,v两个?另外还有关于**arg和*kw的区别

如题,前面调用任意参数是**arg和*kw,这里为什么是*kw,关键还不用*这个符号??谁解释下,谢谢

正在回答

5 回答

#先说一下*和**的区别,最好还是结合例子来说明用途
#比如我们定义了以下的函数
#它的输入参数一共有4个,其中x,y是可以缺省的

In [1]: def f(a,b,x=10,y=20): 
   ...:     return a+b+x+y
   ...:

In [2]: f(1,2,x=3,y=4)
Out[2]: 10

#先看看**的用法,比如,我有一个dict变量kw
#它的元素刚好和我上面定义的函数的缺省部分有一样的
#命名,这时候为了调用函数f,我可以采用比较笨的办法,如
#f(1,2,kw['x'],kw['y']),也可以采用python的一种比较聪明的
#方法,就是把一个dict化成一排key-value对。这种方法就要用到两个**

In [3]: kw={'x':3,'y':4}

In [4]: kw
Out[4]: {'x': 3, 'y': 4}

#比如,这样
In [5]: f(1,2,**kw)
Out[5]: 10

#一个*用法的出现也跟上面将的差不多,
#它就是把一个list,tuple化成一排输入的简写
In [6]: arg=(1,2)

In [7]: f(*arg,x=3,y=4)
Out[7]: 10

#希望看到这里你应该能明白了
In [8]: f(*arg,**kw)
Out[8]: 10

# -------------------------------
class Person(object):
    def __init__(self, name, gender, birth, **kw):
        self.name = name
        self.gender = gender
        self.birth = birth
        #kw是一个dict,它的iteritems返回key-value对组成的
        #tuple, 所以这里要用k,v来接受key和value
        for k, v in kw.iteritems():
            setattr(self, k, v)
13 回复 有任何疑惑可以回复我~
#1

学习攻城狮 提问者

非常感谢!
2015-05-05 回复 有任何疑惑可以回复我~
#2

学习攻城狮 提问者

非常感谢。
2015-05-05 回复 有任何疑惑可以回复我~

之前在困惑为什么用**kw而不用*agrs,现在懂了,就是因为在创建实例的时候,未知的属性既要输入属性名又要为这个未知属性赋值,所以是要k=v的格式,于是就是**kw而不是*agrs了。

0 回复 有任何疑惑可以回复我~

赞!赞!赞!

0 回复 有任何疑惑可以回复我~

这个必须赞一个,学的很扎实呀

0 回复 有任何疑惑可以回复我~

解释的很到位

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

这里为什么需要定义k,v两个?另外还有关于**arg和*kw的区别

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信