一、参数传递规则:
1、不可变参数通过值进行传递(数字、字符串等)
2、可变参数通过"指针"进行传递(字典、列表)
3、实例:
def change(a,b):
a = 2
b[0] = 'spam'
AA = 1
BB = [1,2]
change(AA,BB)
"""
AA= 1
BB= ['spam', 2]
"""
print "AA=",AA
print "BB=",BB
4、避免可变参数被修改,传入可变产生的拷贝
AA1 = 100
BB1 = ['A','B']
change(AA1,BB1[:])
"""
AA1= 100
BB1= ['A', 'B']
"""
print "AA1=",AA1
print "BB1=",BB1
二、函数参数匹配规则:
混合参数使用规则:
1、函数调用赋值先后顺序:位置参数(value)->关键字参数(name=value)->*sequence收集参数->**dict收集参数
2、函数头部定义先后顺序:一般参数(name)->任何默认参数(name=value)->*name ->keyvord-only->**name
参数匹配的步骤:
1、通过位置分配非关键字参数
2、通过匹配变量名分配关键字参数
3、其他额外的非关键字参数分配给*name元组中
4、其他额外的非关键字参数分配给**name字典中
5、使用默认值分配给在头部未得到分配的参数
*和**语法解析:
在头部时意味着收集任意数量的参数
在调用时解包任意数量的参数
1、任意参数实例,收集参数
def f(*args):
print args
"""
输出结果:
()
(1,)
('a', [2, 3], {'a': 3}, 4)
"""
f()
f(1)
f('a',[2,3],{'a':3},4)
def f11(**args):
print args
"""
输出结果:
{}
{'a': 1, 'b': 2}
"""
f11()
f11(a=1,b=2)
2、混合参数实例:
def f22(a,*pargs,**kargs):
print a,pargs,kargs
"""
输出结果:
1 (2, 3) {'y': 2, 'x': 1}
"""
f22(1,2,3,x=1,y=2)
3、解包参数,解包的时候参数个数必须对应上,多或是少均报错
def func11(a,b,c,d):
print a,b,c,d
args = (1,2)
args += (3,4)
"""
运行结果:
通过序列解包完成参数赋值
1 2 3 4
"""
func11(*args) #函数调用的时候,通过序列解包完成对应参数的赋值,注意调用时加'*'
args1 = {'a':1,'b':2,'c':3}
args1['d'] = 4
"""
通过字典的解包完成参数赋值:赋值的字典键值必须同参数名一一对应
1 2 3 4
"""
func11(**args1) #注意调用时加'**'