欢迎访问宙启技术站
智能推送

Python函数中的参数传递和默认参数值

发布时间:2023-12-07 14:41:14

在Python中,函数的参数传递有两种方式:值传递和引用传递。在函数调用过程中,实参传递给形参的方式决定了参数传递的类型。

值传递是指将实参的副本传递给形参,函数内部对形参的任何改变都不会影响实参的值。例如,我们定义一个函数add,接收两个参数a和b,并将a与b相加:

def add(a, b):
    a += b
    return a

x = 1
y = 2
print(add(x, y))  # 输出3
print(x)  # 输出1

在这个例子中,变量x和y是函数的实参,它们的值分别是1和2。当我们调用函数add(x, y)时,实参x和y的副本被赋值给函数的形参a和b。在函数体内,我们将a与b相加,并将结果返回。但是,由于a和b只是实参x和y值的副本,在函数外部的x和y的值并不会受到影响。

引用传递是指将实参的引用传递给形参,函数内部对形参的任何改变都会影响到实参的值。例如,我们定义一个函数change_list,接收一个列表参数:

def change_list(lst):
    lst.append(4)
    return lst

my_list = [1, 2, 3]
print(change_list(my_list))  # 输出[1, 2, 3, 4]
print(my_list)  # 输出[1, 2, 3, 4]

在这个例子中,变量my_list是函数的实参,它的值是[1, 2, 3]。当我们调用函数change_list(my_list)时,实参my_list的引用被传递给函数的形参lst。在函数体内,我们通过lst引用对实参my_list所代表的列表进行修改。由于lst和my_list引用的是同一个列表对象,任何对lst的修改都会直接反映到my_list上。

除了参数传递的方式,Python函数还支持默认参数值。默认参数值是指在定义函数时,给形参指定一个默认值。如果函数调用时没有提供对应实参,那么会使用默认值作为形参的值。例如,我们重新定义函数add,给参数b指定一个默认值2:

def add(a, b=2):
    a += b
    return a

x = 1
print(add(x))  # 输出3
print(add(x, 3))  # 输出4

在这个例子中,我们调用函数add(x),只提供了一个实参x。由于b有默认值2,所以函数会将x与2相加,并返回结果3。我们还可以通过add(x, 3)的方式调用函数,指定参数b的值为3。这时函数会将x与3相加,并返回结果4。

需要注意的是,在Python中,默认参数的值是在函数定义时进行计算的,而不是在函数调用时计算。这意味着如果默认参数是一个可变对象(如列表、字典等),那么当其在函数中被修改时,会一直保持修改后的值,而不会被重置为默认值。例如:

def append_to_list(value, lst=[]):
    lst.append(value)
    return lst

print(append_to_list(1))  # 输出[1]
print(append_to_list(2))  # 输出[1, 2]

在这个例子中,我们定义了一个函数append_to_list,接收一个值参数value和一个列表参数lst。如果调用函数时没有提供lst的值,默认为一个空列表。在函数体内,我们将value添加到lst中,并返回lst。当我们第一次调用append_to_list(1)时,函数会创建一个空列表,并将value添加到lst中,然后返回lst。但是,当我们再次调用append_to_list(2)时,函数会使用前一次调用中的lst作为默认值,并将value添加到lst中。这是因为默认参数的值是在函数定义时计算的,而不是在函数调用时。为了避免这种情况,可以将默认参数设置为None,然后在函数体内使用条件语句来处理默认值为None的情况:

def append_to_list(value, lst=None):
    if lst is None:
        lst = []
    lst.append(value)
    return lst

print(append_to_list(1))  # 输出[1]
print(append_to_list(2))  # 输出[2]

在这个例子中,我们在函数体内使用条件语句来检查lst是否为None。如果是None,我们将其设为一个空列表。这样,每次调用函数时,都会创建一个新的空列表作为默认值。

总结来说,在Python函数中,参数传递方式可以是值传递或引用传递。默认参数值是在函数定义时进行计算的。如果默认参数是一个可变对象,需要注意避免在函数体内修改其值时出现意外结果的情况。