写代码的时候,总会遇到一些函数需要频繁调用,但每次传的参数差不多。比如你写个发消息的函数,大部分通知都是“紧急”级别,只有少数是“普通”。如果每次都得手动填一遍,默认值不是浪费时间吗?
默认参数是怎么回事
函数定义时,给参数指定一个默认值,调用时不传这个参数,就自动用上默认值。这招在 Python、JavaScript 这类语言里特别常见,用起来也顺手。
def send_notification(message, level="紧急"):
print(f"【{level}】{message}")
send_notification("系统即将重启")
# 输出:【紧急】系统即将重启
send_notification("例行检查完成", "普通")
# 输出:【普通】例行检查完成
你看,第一条通知没传 level,默认就是“紧急”,省事又清晰。
实际场景中的好处
在开发后台服务时,经常要查数据库。查询函数通常带分页参数,比如 page 和 size。大多数时候用的是第一页、每页10条,如果每次都要写 page=1, size=10,代码看着就啰嗦。
def fetch_users(page=1, size=10, status=None):
# 模拟查询逻辑
print(f"查询第 {page} 页,每页 {size} 条,状态={status}")
fetch_users()
# 查询第 1 页,每页 10 条,状态=None
fetch_users(status="active")
# 查询第 1 页,每页 10 条,状态=active
这样调用清爽多了,关键参数一目了然,不重要的靠默认值兜底。
注意几个坑
默认参数虽然方便,但也有容易踩的地方。最典型的是把可变对象(比如列表、字典)当默认值。
def add_item(item, items=[]):
items.append(item)
return items
看起来没问题,但连续调用你会发现,items 像是有记忆一样,上次加的东西还在。因为默认参数只初始化一次,后续所有调用共用同一个列表。
正确的写法是:
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
这样每次调用都能拿到干净的新列表。
不同语言的小差异
JavaScript 的默认参数写法和 Python 类似:
function greet(name = "游客") {
console.log(`你好,${name}!`);
}
而像 C++ 则是在声明函数时指定默认值,且只能从右往左依次设置,不能跳着来。
不管哪种语言,核心思路都一样:减少重复输入,提升代码可读性。只要别乱用可变默认值,这功能用起来又安全又高效。