转载自http://blog.csdn.net/syylx/article/details/44178377
一、首先了解python与C /C++的两点不同:
1、 python函数中的参数是可变的,而C/C++是不可变的(除却默认参数引起的省略);
2、 python没有指针的概念,也就没有了函数的按指针传递,因此python函数形参中的星号,并不是按引用传递。
那么它到底是什么作用呢?
二、其真实作用是收集参数,Python可以提供多于实际形参个数的实参,而且还可以分为普通参数、非关键字参数和关键字参数三种。
1、没星号是最常用的参数,可以是可变(mutable)类型变量,也可以是不可变(immutable)类型变量(可变数据结构类型和不可变数据结构类型在作为函数参数时存在不同,可变数据结构类型类似于C++按引用传递,在函数内部,尽管在局部作用域中,某些操作仍然会改变可变数据类型参数的值,而不可变数据结构类型不存在,如果需要函数内部的操作会改变函数外部的值,那么不可变数据结构类型又不同于C++按引用传递,我们只能通过return的形式返回,然后赋值语句或者序列解包的形式获取改变或者将不可变类型改变为可变类型)
具体看例子:
- #! /usr/bin/python
- n = [2]
- m = 2
- def func_mutable(n):
- n[0] += 1
- print n
- def func_imutable(m):
- m += 1
- print m
- if __name__ == '__main__':
- func_mutable(n)
- print n
- func_imutable(m)
- print m
- output:
- [3]
- [3]
- 3
- 2
2、一个星号是将非关键字参数收集起来,以tuple的形式保存
3、两个星号是将关键字参数收集起来,以dict的形式保存,如参数func(keywords = 5)则输出该参数形式为{keywords: 5 }。
。
三、关键字参数与默认参数的区别
关键字参数是在传递构成中不必按照顺序传递,必须要提供”传递参数名=传递参数值”形式的参数,而传递过程中也转变为dict的键值对map关系;默认参数(又称为位置参数,听名字就知道这个要一一对应)是可以在对应的位置可写可不写的参数。
默认参数是关键字参数的子集,如果在定义时候就给定参数值的是默认参数,调用时候可以提供关键字参数,可以提供在对应位置提供参数,也可以不提供,使用默认参数。
如果使用关键字参数,那一定要保证从右往左的顺序,防止存在形参实参个数不匹配问题。
Example:
- #! /usr/bin/python
- def Func(x, y, z = 2, w = 4):
- print x,y,z,w
- if __name__ == '__main__':
- Func(1,2) <span style="white-space:pre"> </span>#默认参数
- Func(1,2 ,z = 5, w = 3)<span style="white-space:pre"> </span>#关键字参数
- 1 2 2 4
- 1 2 5 3