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

Python函数中的参数传递与默认参数设置

发布时间:2023-07-04 20:44:03

在Python中,函数的参数传递方式可以分为两种:按值传递和引用传递。

按值传递是指将参数的值复制一份给函数内部的变量,在函数内部对参数进行修改不会影响到外部的变量。这种传递方式常用于不可变对象(如数字、字符串、元组等)的传递。例如:

def func(a, b):
    a = 10
    b = [1, 2, 3]
    
x = 5
y = [4, 5, 6]
func(x, y)
print(x)  # 输出 5
print(y)  # 输出 [4, 5, 6]

引用传递是指将参数的引用传递给函数内部的变量,修改函数内部的变量会同时影响到外部的变量。这种传递方式常用于可变对象(如列表、字典等)的传递。例如:

def func(lst):
    lst.append(4)
    
list1 = [1, 2, 3]
func(list1)
print(list1)  # 输出 [1, 2, 3, 4]

除了按值传递和引用传递外,Python函数还支持设置默认参数。默认参数是在函数定义时给参数一个默认的初始值,调用函数时如果没有传递该参数,则使用默认值。默认参数可以减少调用函数时的参数个数,使得函数调用更加简便。例如:

def greet(name='Alice'):
    print('Hello, ' + name + '!')
    
greet('Bob')  # 输出 Hello, Bob!
greet()  # 输出 Hello, Alice!

默认参数的值应该是不可变对象,因为如果默认参数是可变对象,那么在函数调用时会共用同一个对象,导致不希望的结果。例如:

def append_value(item, lst=[]):
    lst.append(item)
    return lst
    
print(append_value(1))  # 输出 [1]
print(append_value(2))  # 输出 [1, 2]
print(append_value(3))  # 输出 [1, 2, 3]

上面的例子中,由于默认参数lst是可变对象(列表),它会在函数定义时创建并保存起来,所以每次调用append_value函数时都会使用同一个列表对象。这导致了前两次调用append_value函数时的结果不是我们期望的。如果我们希望每次调用append_value函数时都创建一个新的列表对象,可以使用None作为默认参数的值,并在函数内部判断并创建新的列表。例如:

def append_value(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst
    
print(append_value(1))  # 输出 [1]
print(append_value(2))  # 输出 [2]
print(append_value(3))  # 输出 [3]

这样每次调用append_value函数时都会创建一个新的空列表,解决了上面的问题。

总结起来,Python函数中的参数传递方式有按值传递和引用传递两种。默认参数可以为函数的参数设置默认值,减少函数调用时的参数个数。但是需要注意默认参数的值应该是不可变对象,以避免出现不希望的结果。