python传入参数的问题

我突然发现:我把一个dict传入一个可变参数(元组)的函数里,他输出的是dict的键值能解释一下这个现象吗?>>>deftest(*args):print(args)>>... 我突然发现 : 我把一个 dict 传入 一个可变参数(元组)的函数里 , 他输出的是 dict的键值 能解释一下这个现象吗?

>>>def test(*args):
print(args)

>>>test(*{'a':1,'b':2})
('a', 'b')
展开
 我来答
wodesitanfu
2017-09-07 · TA获得超过2235个赞
知道大有可为答主
回答量:1908
采纳率:80%
帮助的人:887万
展开全部

python在定义函数的时候,存在两种特殊定义,*和**的传值方式,正是因为这两种定义,python 函数的传值,非常灵活,在cpp编程的时候,不支持方法重载,因为没必要了。。。

在参数前面加个*号,表明这个函数会将这个变量代表的内容,转换为一个元祖,所以函数可以接收N个元素,这N个元素在函数里面转成一个元祖。比如这种

def fun1(*a):  #定义
    print(a)  #1输出
    print(*a)  #2输出
x = [1,2,3]
fun1(x)  #1调用
fun1(*x)  #2调用
fun(1,2,3)  #3调用

因为fun1定义的时候,告诉函数,x可以接受N个对象,这个对象在函数里面会转成一个元祖保存,所以在1调用的时候,x在fun1函数里面会被当成一个元祖,但我们知道,x其实是一个元祖,1调用的时候,就传了一个对象进去。所以,结果如下

([1,2,3],)   #1输出

[1,2,3]     #2输出

为啥?1输出,清楚无误的告诉print(print也是函数,也支持*args方式传值),你直接把a对象打印出来,a对象是啥?一个包含1个对象的元祖,所以就是(x,)这样的结果。那2输出呢?2输出在调用的时候,在a对象前面已经拆解了元祖,所以,传给print函数的,是一个对象,就是x了。

同理,在2调用的时候,因为x对象被拆开,所以,func1被传入多个值,此时的a是一个元素和x相同的元祖。所以2调用的1输出,就是一个值,就是(1,2,3)。2输出,因为被拆解了再传给print,所以,print其实被传入了多个值,然后将这些值全部打印出来,所以结果是1,2,3.

那3调用呢?其实本质和2调用是一样的

那双星号呢?双星号是拆解key-val格式对的内容,在函数定义的时候,是默认讲传入的产生转为字典。而规律和上面说的单星号一致。如果用单星号去拆解key-val对象,只会拆解出key。后面的就不多说了。

为啥单引号拆解key-val对象,可以拆出key呢。。。源代码就这么执行的,为啥当初设计,理由是啥。。。不清楚。。

匿名用户
2017-09-07
展开全部

你前面有个*,传入的是一个tuple不是一个dict

>>> def test(*args):
    print(args)

>>> test(*{'a':1,'b':2})
('a', 'b')
>>> test({'a':1,'b':2})
({'a': 1, 'b': 2},)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式