针对前一篇文档《Python 函数中使用默认值参数 — 谈谈可变对象的坑?!》再进行补充说明
在 python 中进行函数调用,其参数可以使用 “默认值参数” 类型,那么当为 “默认值” 参数传入一个 “对象” 的时候,有什么限制和要求么?
参数的默认值可以是:
- 可变对象,如列表、字典、集合
- 不可变对象,如整数、浮点数、字符串和元组
一. 参数默认值使用可变对象
1. 调用时不传实参
函数定义中,形参被赋予了一个默认值,且该默认值为一个可变对象(空白的列表)
- id(): 该方法可以输出对象的唯一标识,用于区分是否为同一个对象
- 连续调用该函数两次
- 观察:函数内部对局部变量 lt 的处理
# 定义一个函数,其形参 lt 是一个 “可变对象(列表)”
def fun(lt=[]):
print(f'函数内:lt = {lt}, 指向对象:id(lt)={id(lt)}')
# 连续两次调用函数,且均不传参
fun()
fun()
# 输出为:对象id相同,证明二者为同一个对象
函数内:lt = [], 指向对象:id(lt)=2333811036544
函数内:lt = [], 指向对象:id(lt)=2333811036544
结合图形分析:
- 第一次调用,在函数内部为局部变量(即形参) lt 创建了一个对象,编号为2333811036544
- 第二次调用,由于不需要额外的处理活动,因此在函数内部复用了前面创建的 lt 对象,不再创建一个新的对象
- 原因: