在 Python 中,函数的默认参数(Default Arguments)允许你在定义函数时为某些参数指定一个默认值。调用函数时,如果未提供这些参数的值,它们将自动使用默认值。这一特性可以简化函数调用,提高代码的灵活性。
1. 基本语法
python
def greet(name, message="Hello"):
print(f"{message}, {name}!")
- 参数 name 没有 默认值,调用时必须传入。
- 参数 message 有默认值 "Hello",调用时可以省略。
python
greet("Alice") # 输出:Hello, Alice!
greet("Bob", "Hi") # 输出:Hi, Bob!
2. 默认参数的位置规则
所有带默认值的参数必须出现在不带默认值的参数之后 ,否则会引发语法错误:
python
def func(a=1, b): # 错误:SyntaxError
pass
def func(a, b=1): # 正确
pass
3. 默认值的求值时机
默认参数的值只在函数定义时计算一次 ,而不是每次调用时重新计算。这会导致一个常见的陷阱:当默认值是可变对象(如列表、字典)时,多次调用可能共享同一个对象。
陷阱示例
python
def add_item(item, lst=[]):
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] ← 居然保留了上一次的结果!
print(add_item(3, [])) # [3] ← 显式传入新列表,正常
这是因为默认列表 [] 在函数定义时被创建,所有调用如果不提供 lst 参数,都会使用同一个列表对象。
避免陷阱的方法
通常的做法是:将默认值设为None**,在函数内部创建新对象** 。
python
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [2] ← 每次得到新列表