值传递和引用传递区别
如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递。如果你传入的参数对象是不可变的对象:数字,元组,字符串,这个时候就是值传递。
对于值传递,函数内部修改的是参数的副本,不会改变原值;
对于引用传递,函数内部修改了是变量的指向,从而相应对变量进行了改变。
举例如下:
当参数是不可变对象时:
>>> 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