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

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

发布时间:2023-05-30 23:21:58

Python是一种高级的编程语言,提供了很多便捷的语言特性,如默认参数设置和参数传递。在Python函数中,参数传递及默认参数设置是非常重要的概念。本文将介绍Python中的参数传递及默认参数设置。

1. 参数传递

Python中函数参数的传递分为传值(call by value)和传址(call by reference)两种方式。Python实际上不支持传递引用,只有传递对象的引用,所以可以将其视为一种传值的方式。

传值方式是将参数的值复制到函数内部的新变量中,并在函数内部进行操作,改变的只是新变量的值,外部的参数值不受影响。而传址方式则是直接将参数的引用传递给函数,函数内部改变的是参数的值,因此外部的参数值也会跟着改变。

看一个例子,可以方便地理解参数传递的方式:

def func(a):
    a = a + 1
    return a

n = 5  
print(func(n))   # 6
print(n)   # 5

在这个例子中,我们将变量n传给函数func。函数内部会像变量a一样创建一个新的变量,值为n的值,然后对a进行操作,当函数返回时,原始的变量n保持不变。

如果参数是列表或字典等可变对象,则可以在函数内部对其进行操作。由于列表或字典的id没有改变,因此所有对该对象的引用都会得到更新,因此改变会反映在函数之外。例如,

def func(a):
    a[0] = a[0] + 1
    return a

lst = [1, 2, 3]
print(func(lst))   # [2, 2, 3]
print(lst)   # [2, 2, 3]

在这个例子中,我们传递的参数是一个列表对象。函数内部对列表的 项进行了递增操作,并返回了一个修改后的列表,原始的列表也发生了改变,这是由于列表是可变对象。

2. 默认参数设置

Python中函数可以设置默认参数,这些参数在函数被调用时,如果没有被指定,将使用默认值进行初始化。设置默认参数的方法是在函数声明时给参数指定一个默认值。例如,

def greet(name, greeting='Hello'):
    print(greeting, name)

greet('Tom')   # Hello Tom
greet('Alice', 'Hi')   # Hi Alice

在这个例子中,参数greeting被赋为默认值Hello。函数被调用时,如果没有传递greeting参数,则会使用默认值。如果传递了greeting,则会覆盖默认值。

当默认参数被使用时,在函数首次被编译时,Python会分配默认值的内存地址,并将其保存在函数对象中。然后每次调用函数时,如果没有传递指定参数,则会使用该地址中保存的值。因此,在修改默认参数的值时要非常小心,因为该值将被保持,直到函数被重新编译或删除。

def add(lst=[]):
    lst.append(len(lst))
    return lst

print(add())   # [0]
print(add())   # [0, 1]
print(add())   # [0, 1, 2]

在这个例子中,参数lst是一个默认值为空的列表。函数被调用时,lst会被初始化为空列表。通过调用append来添加一个项,返回修改后的列表。由于默认值始终保持,所以这个函数调用的结果会与预期不符,可能是因为Python在函数首次被编译时为默认列表分配了一个空列表,缓存模式下,如果缓存的默认值为空,则函数调用将重复地构造并返回同一个列表对象。

为了防止出现这种问题,可以将参数改为None,并在函数体内进行特判。例如,

def add(lst=None):
    if lst is None:
        lst = []
    lst.append(len(lst))
    return lst

print(add())   # [0]
print(add())   # [0]
print(add())   # [0]

在这个示例中,我们将默认值更改为None,并在函数中进行特判。如果函数被调用时lst为None,则会将lst初始化为空列表。由于每次调用都需要检查参数是否为None,因此可能会略微降低程序的性能。

总的来说,Python函数中的参数传递及默认参数设置是我们编写高效程序的关键部分。通过理解这些概念,并使用它们来编写函数,我们可以更好地掌握Python编程语言。