值传递和引用传递区别
如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递。如果你传入的参数对象是不可变的对象:数字,元组,字符串,这个时候就是值传递。
对于值传递,函数内部修改的是参数的副本,不会改变原值;
对于引用传递,函数内部修改了是变量的指向,从而相应对变量进行了改变。
举例如下:
当参数是不可变对象时:
>>> a = 10
>>> def change(a):
a = 20
>>> change(a)
>>> a
10
当参数是可变对象时:
>>> b = [1,2,3]
>>> def change(b):
b[0] = 0
>>> change(b)
>>> b
[0, 2, 3]
位置参数与关键字参数
当多个实参向多个形参传递,通常是根据位置来判断对应关系。例如:5传递给了x,2传递给了y,1传递给了z:
>>> def yao(x, y, z):
return x - y - z
>>> yao(5, 2, 1)
2
在传参时,指定参数名称,可以忽略位置因素。
例如:
>>> def yao(x, y, z):
return x - y - z
>>> yao(z=1, y=2, x=5)
2
函数参数可以指定默认值。
例如:下面函数在指定了默认值后,如果在调用时没有传递相应参数,参数就会使用默认值。>>> def yao(x=5, y=2, z=1):
return x - y - z
>>> yao()
2
参数收集
通过在形参前放置一个*号,该形参就自动创建为一个元祖,可接收多个实参作为其元素。
举例如下:>>> def yao(*params):
print(params)
>>> yao(1,2,3,4,5)
(1, 2, 3, 4, 5)
推荐将该参数作为形参的最后一个参数,这样在前面形参参数接收完毕后,剩余的参数就都属于该参数的元素。
例如:
>>> def yao(x,y,*z):
print(z)
>>> yao(1,2,3,4,5)
(3, 4, 5)
可以形参前加上**来接收关键字参数。该参数是字典形式。
例如:
>>> def yao(**params):
print(params)
>>> yao(x=1, y=2, z=3)
{'x': 1, 'y': 2, 'z': 3}
参数分配
参数收集说的是,形参如何通过元组形式或字典形式接收多个实参。参数分配说的是,一个元组形式的实参如何分配给多个形参。
具体操作方式与参数收集类似,具体是在实参传递时适用*号或**号。
例如:将元组传递给多个形参:
>>> def yao(x, y):
return x + y
>>> params = (1, 2)
>>> yao(*params)
3
再例如,将字典传递给多个形参:
>>> def yao(x,y):
return x + y
>>> params = {
'y':1,
'x':2
}
>>> yao(**params)
3