python 函数参数传递和参数匹配

本文探讨了Python中参数传递的机制,强调了不可变对象(如字符串、简单类型、元组)通过值传递,而可变对象(如字典、列表)通过引用传递。在函数内部修改可变对象的值会影响到调用者。同时,介绍了函数参数匹配的过程,包括参数分解和匹配顺序。
摘要由CSDN通过智能技术生成

参数传递:

参数的传递是通过自动将对象赋值给本地变量来实现的,作为参数被传递的对象从不自动拷贝

在函数内部的参数名的赋值不会影响调用者

改变函数的可变对象参数的值也许会对调用者有影响(实质:不可变对象(如字符串 简单类型 元组)是通过'值'进行传递的,可变对象如字典 列表是通过'指针'进行传递的)

>>> def change(a,b):
a=2
print id(b)
print b
b[0]='spam'
print b

>>> x=1
>>> l=[1,2]
>>> change(x,l)
27900424
[1, 2]
['spam', 2]
>>> b


Traceback (most recent call last):
  File "<pyshell#87>", line 1, in <module>
    b
NameError: name 'b' is not defined
>>> id(l)
27900424
>>> 
b是一个本地变量名,但是它被传给了一个可变对象,因为第二个赋值是在原处发生的对象的改变,对函数中的b[0]进行赋值的结果会在函数返回后影响L的值,实际上我们没有修改b,我们修改的是b当前所引用的对象的一部分,并且这个改变将会影响调用者


函数参数匹配:

 位置:从左到右进行匹配
关键字参数:通过参数名进行匹配
默认参数:为没有传入值的参数定义参数值
可变参数:手机任意多的基于位置或者关键字的参数(函数能够使用特定的参数,它们是以字符*开头,收集任意多的额外的参数)
可变参数:传递任意多的基于位置或者关键字的参数(调用者能够在使用*语法去将参数集合打散,分成参数。这个*与在函数头部*恰恰相反:在调用这中意味着传递任意多的参数)
**允许将关键字转换成字典


例子

>>> def f(a,b,v):
print a,b,v



>>> f(v=2,b=1,a=10)
10 1 2
>>> def f(a=1,b,c=2):
print a,b,c

SyntaxError: non-default argument follows default argument  //这里注意默认的参数值应该是连续的从左到右
>>> 
>>> def f(a,b=1,c=2):
print a,b,c
>>> f(1)
1 1 2
>>> f(1,c=1000)
1 1 1000
>>> def f(*args):
print args
>>> f()
()
>>> f(1,2,3,4,5,6,7)
(1, 2, 3, 4, 5, 6, 7)
>>> def f(**args):
print args
>>> f()
{}
>>> f(a=1,b='sadf234')
{'a': 1, 'b': 'sadf234'}

'//参数分解

>>> def f(a,b,c,d):print a,b,c,d
>>> args=(1,2)
>>> args+=(3,4)

>>> f(*args)
1 2 3 4

参数匹配过程顺序

1.通过位置分配非关键字参数
2通过匹配变量名分配关键字参数
3其他额外的非关键字参数匹配到*name元组中
4其他额外的关键字参数匹配到**name字典中
5用默认值分配给在头部为得到分配的参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值