Python函数的参数传递及默认参数:讲解Python函数中的参数传递方式和默认参数的使用方法。
在Python中,函数的参数传递方式有两种:值传递和引用传递。对于不可变类型(如整数、浮点数、字符串等),使用值传递,而对于可变类型(如列表、字典等),使用引用传递。
在值传递中,函数接收到的是参数的拷贝,对参数的修改不会影响原始值。例如:
def change_num(num):
num = 10
number = 5
change_num(number)
print(number) # 输出为5
在上述代码中,change_num()函数接收到number的拷贝,将拷贝赋值为10。然而,这并不会影响原始的number变量,所以输出依然为5。
而在引用传递中,函数接收到的是参数的引用,对参数的修改会影响原始值。例如:
def change_list(my_list):
my_list.append(4)
old_list = [1, 2, 3]
change_list(old_list)
print(old_list) # 输出为[1, 2, 3, 4]
在上述代码中,change_list()函数接收到old_list的引用,并在原始列表上进行修改,所以输出为[1, 2, 3, 4]。
此外,在Python中还可以使用默认参数来定义函数。默认参数是在函数定义时给参数赋初始值,当在调用函数时没有传递参数时,将使用默认参数的值。例如:
def greet(name='Alice'):
print('Hello, ' + name + '!')
greet() # 输出为Hello, Alice!
greet('Bob') # 输出为Hello, Bob!
在上述代码中,greet()函数定义了一个名为name的默认参数,并将其值设为'Alice'。当调用greet()函数时,未传入参数,所以会使用默认参数的值,并输出'Hello, Alice!'。当调用greet('Bob')函数时,传入了参数'Bob',所以会使用传入的参数,并输出'Hello, Bob!'。
需要注意的是,默认参数的值在函数声明时就会被计算出来,并且只计算一次。所以,如果默认参数的值是一个可变类型(如列表或字典),并且在函数中对其进行了修改,那么这个修改会持续影响到后续函数的调用。例如:
def add_item(item, my_list=[]):
my_list.append(item)
print(my_list)
add_item(1) # 输出为[1]
add_item(2) # 输出为[1, 2]
add_item(3) # 输出为[1, 2, 3]
在上述代码中,add_item()函数定义了一个名为my_list的默认参数,并将其值设为一个空列表。每次调用add_item()函数时,都会将传入的item添加到my_list中,并输出my_list。然而,由于默认参数是在函数声明时计算出来的,所以在后续函数调用中,my_list是同一个列表对象,并且会持续地被修改。所以,输出结果会依次为[1]、[1, 2]、[1, 2, 3]。
为了避免这个问题,可以将默认参数的值设为None,并在函数内部创建一个新的列表。例如:
def add_item(item, my_list=None):
if my_list is None:
my_list = []
my_list.append(item)
print(my_list)
add_item(1) # 输出为[1]
add_item(2) # 输出为[2]
add_item(3) # 输出为[3]
在上述代码中,如果没有传入my_list参数,那么会在函数内部创建一个新的空列表。这样,每次函数调用时都会使用一个新的列表,并输出正确的结果。
