函数默认参数是可变对象(如 list/dict)时为什么会“记住”上一次值

发布时间 - 2026-01-20 00:00:00    点击率:
函数默认参数在定义时创建并复用,可变对象(如列表)会因共享同一实例导致状态累积;安全做法是用None作默认值并在函数内新建对象。

因为函数的默认参数在定义时就创建并绑定到函数对象上,而不是每次调用时重新生成。

默认参数只在函数定义时求值一次

Python 中,函数定义(def 语句执行时)就会计算默认参数的值,并把该对象存储在函数的 __defaults__ 属性里。之后每次调用函数、没传对应参数时,就复用这个已存在的对象。

例如:

def append_to(item, lst=[]):
    lst.append(item)
    return lst

print(append_to(1)) # [1] print(append_to(2)) # [1, 2] ← 不是 [2] print(append_to(3)) # [1, 2, 3]

这里的 lst=[] 在 def 执行时创建了一个空列表对象,后续所有未传 lst 的调用都共用它。

可变对象被反复修改,状态持续累积

列表、字典、集合等可变对象支持原地修改(如 .append()[key] = val),而默认参数引用的又是同一个对象,所以每次调用都在“往同一个容器里加东西”。

这和不可变对象(如 intstrtuple)不同——它们无法原地修改,每次操作都会产生新对象,不会暴露共享状态问题。

安全写法:用 None 作占位符

惯用做法是把默认值设为 None,并在函数体内显式创建新对象:

  • def append_to(item, lst=None):
  • if lst is None:
  •   lst = []
  • lst.append(item)
  • return lst

这样每次调用都得到一个全新列表,互不影响。

可以验证默认参数对象是否被复用

通过检查函数的 __defaults__ 和对象 id

print(id(append_to.__defaults__[0]))  # 第一次调用前后 id 相同
append_to(1)
print(id(append_to.__defaults__[0]))  # 还是同一个 id

说明不是“记住了值”,而是根本就没换过对象。


# python  # app  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python高阶函数应用_函数作为参数说明【指导】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Python文件流缓冲机制_IO性能解析【教程】  js代码实现下拉菜单【推荐】  中山网站推广排名,中山信息港登录入口?  网页设计与网站制作内容,怎样注册网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel怎么实现验证码(Captcha)功能  如何快速配置高效服务器建站软件?  动图在线制作网站有哪些,滑动动图图集怎么做?  想要更高端的建设网站,这些原则一定要坚持!  Laravel如何实现事件和监听器?(Event & Listener实战)  如何在橙子建站中快速调整背景颜色?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  java ZXing生成二维码及条码实例分享  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何实现建站之星域名转发设置?  Java垃圾回收器的方法和原理总结  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Android滚轮选择时间控件使用详解  轻松掌握MySQL函数中的last_insert_id()  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  简历没回改:利用AI润色让你的文字更专业  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel如何与Pusher实现实时通信?(WebSocket示例)  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何实现API资源集合?(Resource Collection教程)  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何选择PHP开源工具快速搭建网站?  phpredis提高消息队列的实时性方法(推荐)  如何快速搭建FTP站点实现文件共享?  如何快速查询网站的真实建站时间?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  如何在IIS中新建站点并配置端口与IP地址?  青岛网站建设如何选择本地服务器?  b2c电商网站制作流程,b2c水平综合的电商平台?  如何在IIS管理器中快速创建并配置网站?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音