一、参数传递机制
根据实际参数的类型不同,参数传递方式可分为 2 种:值传递和引用(地址)传递
1、值传递:适用于实参类型为不可变类型(字符串、数字、元组);
2、引用/地址传递:适用于实参类型为可变类型(列表,字典);
def demo(obj) :
obj += obj
print("形参值为:",obj)
print("-------值传递-----")
a = "C语言中文网"
print("a的值为:",a)
demo(a)
print("实参值为:",a)
print("-----引用传递-----")
a = [1,2,3]
print("a的值为:",a)
demo(a)
print("实参值为:",a)
运行结果为:
-------值传递-----
a的值为: C语言中文网
形参值为: C语言中文网C语言中文网
实参值为: C语言中文网
-----引用传递-----
a的值为: [1, 2, 3]
形参值为: [1, 2, 3, 1, 2, 3]
实参值为: [1, 2, 3, 1, 2, 3]
值传递和引用传递的区别是
函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
二、参数指定方式
1、位置参数:按位置指定 ,实参和形参数量必须一致
函数调用时括号中只写各个实参,这时形参的值与实参按照顺序一一对应
在调用函数,指定的实际参数的数量,必须和形式参数的数量一致(传多传少都不行)
2、关键字参数:按形参名字显示指定,使用形式参数的名字来确定输入的参数值。
在函数调用时显示指定形参(函数定义时的参数)与实参的对应关系 :形参=实参
通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可。
这是函数调用时 形参的值与实参的先后顺序无关
def add(x,y):
print('x=',x)
print('y=',y)
#按位置指定
add(2,3)
add(3,2)
#形参名字显示指定
add(x=2,y=3)
add(y=3,x=2)
运行结果
按位置指定 与顺序有关
x= 2
y= 3
x= 3
y= 2
形参名字显示指定 与位置无关
x= 2
y= 3
x= 2
y= 3
3、默认参数:参数指定默认值
在调用函数时如果不指定某个参数,Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。这样的话,即便调用函数时没有给拥有默认值的形参传递参数,该参数可以直接使用定义函数时设置的默认值。
注意:指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
参数指定默认值之后在函数调用时 实参可以只给出没有指定默认值的那些参数 若所有参数都在形参中给出,默认值不生效。
def add(x,y=0):
print('x=',x)
print('y=',y)
add(2)
add(3,2)
运行结果
x= 2
y= 0
x= 3
y= 2
4、可变长度参数
两种形式:函数定义时在参数名前加1个*或2个**
(1)*parameter用来接受多个实参并将其放在一个元组中
d无论调用该函数时传递了多少实参,一律将其自动放入元组中
>>> def demo(*p):
print(p)
>>> demo(1,2,3)
(1, 2, 3)
>>> demo(1,2)
(1, 2)
(2)**parameter接受多个关键字参数并存放到字典中
调用函数时自动将接受的参数转换为字典,注意实参此时需要是关键字参数
>>> def demo(**p):
for item in p.items()</