分两类。
一是作为函数定义时,一类是函数调用时。
一个 * 对应一个元组;
两个 ** 对应一个字典;
-------------------
当函数定义时:
一个 * 表示此函数接受的参数为一个元组;
两个 ** 表示此函数接受的参数是一个字典;
举例:
下面是不正确的调用:
同样地,onestar定义接受一个元组,表示允许接受可变参数。但它只能接受像1,2,3这样的元组,而无法理解a=1,b=2类似这样的字典。
twostar定义为接受一个字典,表示允许key=value这样的可变参数。如果只传1,2,3这样的元组给它,同样报错。
----------------------------
当函数调用时:
* 号起了自动拆封参数的作用。
一个 * 表示对一个元组参数进行拆封;
两个 ** 表示对一个字典参数进行拆封;
举例:
x是一个列表,直接传给test 函数是会报错的。因为test 定义为接受三个参数。而你传给它的竟是一个列表,显然不行。因此,你通过在前面加* 号,python会自动帮你进行参数拆分。 两个** 号也是类似一样的。
一是作为函数定义时,一类是函数调用时。
一个 * 对应一个元组;
两个 ** 对应一个字典;
-------------------
当函数定义时:
一个 * 表示此函数接受的参数为一个元组;
两个 ** 表示此函数接受的参数是一个字典;
举例:
上面的调用是正确的调用。def nostar(a): print a def onestar(*a): print a def twostar(**a): print a nostar(1) onestar(1,2,3) twostar(a=1,b=2,c=3)
下面是不正确的调用:
nostar 定义只接受一个参数,则它只能明确接受一个参数,不允许可变参数,不管是传1,2,3的元组给它,还是传a=1,b=2这样的字典给它,都是错误的用法。编译器会访回一个错误。nostar(1,2,3) nostar(a=1,b=2,c=3) onestar(a=1,b=2,c=3) twostar(1, 2, 3)
同样地,onestar定义接受一个元组,表示允许接受可变参数。但它只能接受像1,2,3这样的元组,而无法理解a=1,b=2类似这样的字典。
twostar定义为接受一个字典,表示允许key=value这样的可变参数。如果只传1,2,3这样的元组给它,同样报错。
----------------------------
当函数调用时:
* 号起了自动拆封参数的作用。
一个 * 表示对一个元组参数进行拆封;
两个 ** 表示对一个字典参数进行拆封;
举例:
通过上面的例子你就明白了。def test(a, b, c): print a, b, c test(1,2,3) x=(1,2,3) test(*x) y={'a':1, 'b':2, 'c':3} test(**y)
x是一个列表,直接传给test 函数是会报错的。因为test 定义为接受三个参数。而你传给它的竟是一个列表,显然不行。因此,你通过在前面加* 号,python会自动帮你进行参数拆分。 两个** 号也是类似一样的。