Python函数参数传递机制详解:位置、默认、可变长与关键字参数

季宁
季宁
发布时间:2026-10-15 | 7人浏览过
原创

本文深入解析Python中函数参数的四种定义方式:位置参数、默认参数、可变长度参数(*args)及关键字参数(**kwargs)。详细阐述调用时的解析优先级与顺序,通过代码示例说明各参数类型的行为特征及常见错误,帮助开发者掌握Python函数调用的核心机制。

Python函数参数传递机制概述

在Python中,函数参数的使用主要涉及两个核心方面:


1. 函数参数的定义规则


2. 调用函数时参数的解析过程



Python函数参数的四种定义方式

首先探讨第一个问题,Python中函数参数的定义主要包含以下四种方式:


1.F(arg1,arg2,...)

这是最基础且常见的定义方式。一个函数可以定义任意数量的参数,各参数之间以逗号分隔。在调用此类函数时,必须在函数名后的括号内提供与形参数量完全一致的实际参数(实参),且传入顺序必须与定义顺序严格对应。即形参与实参在数量和顺序上必须一一对应,第一个形参对应第一个实参。例如:


def a(x,y):


print x,y


调用该函数时,若执行a(1,2),则x被赋值为1,y被赋值为2,形参与实参正确对应。如果调用a(1)或a(1,2,3),则会因参数数量不匹配而报错。




2.F(arg1,arg2=value2,...)

这是第一种方式的改进版,引入了默认参数值。


def a(x,y=3):


print x,y


调用该函数时,若执行a(1,2),x取1,y取2;若仅执行a(1),则不会报错,此时x仍为1,而y自动采用默认值3。此外,这两种方式均支持通过关键字指定参数位置,例如a(y=8,x=3)也是合法的调用形式。




3.F(*arg1)

前两种方式的形参数量是固定的,但在实际开发中,有时无法确定传入参数的具体个数。此时第三种方式尤为有用,它通过以单个星号(*)加上形参名的方式来接收不定数量的实参,实参个数可以为0个或多个。需要注意的是,无论传入多少个实参,在函数内部它们都会被封装在一个以该形参名为标识符的元组(tuple)中。


>>> def a(*x):


if len(x)==0:


print 'None'


else:


print x


>>> a(1)


(1,) #存放在元组中


>>> a()


None


>>> a(1,2,3)


(1, 2, 3)


>>> a(m=1,y=2,z=3)



Traceback (most recent call last):


File "<pyshell#16>", line 1, in -toplevel-


a(m=1,y=2,z=3)


TypeError: a() got an unexpected keyword argument 'm'




4.F(**arg1)

在形参名前添加两个星号(**)表示该参数用于接收关键字参数。函数内部会将这些参数封装在一个以形参名为标识符的字典(dictionary)中。此时,调用函数时必须采用arg1=value1, arg2=value2的形式进行传参。


>>> def a(**x):


if len(x)==0:


print 'None'


else:


print x


>>> a()


None


>>> a(x=1,y=2)


{'y': 2, 'x': 1} #存放在字典中


>>> a(1,2) #这种调用则报错



Traceback (most recent call last):


File "<pyshell#25>", line 1, in -toplevel-


a(1,2)


TypeError: a() takes exactly 0 arguments (2 given)




函数调用时的参数解析顺序与示例

上述介绍了四种参数定义方式。接下来分析函数在调用过程中参数的解析逻辑。只需记住这四种方法的解析优先级依次降低:首先解析方式1中的位置参数,其次解析方式2中的关键字赋值参数,接着解析方式3中剩余的位置参数(组成元组tuple),最后将剩余的关键字参数(组成字典dictionary)传递给带两个星号的形参(方式4)。


>>> def test(x,y=1,*a,**b):


print x,y,a,b




>>> test(1)


1 1 () {}


>>> test(1,2)


1 2 () {}


>>> test(1,2,3)


1 2 (3,) {}


>>> test(1,2,3,4)


1 2 (3, 4) {}


>>> test(x=1,y=2)


1 2 () {}


>>> test(1,a=2)


1 1 () {'a': 2}


>>> test(1,2,3,a=4)


1 2 (3,) {'a': 4}


>>> test(1,2,3,y=4)



Traceback (most recent call last):


File "<pyshell#52>", line 1, in -toplevel-


test(1,2,3,y=4)


TypeError: test() got multiple values for keyword argument 'y'

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表