当前位置: 首页 > news >正文

Python 之可变参数作为默认值的坑

当然,官方肯定建议是不要用可变参数作为函数的默认值,但是奈何肯定有很多犟牛,偏偏不信邪,然后就出现了很多奇奇怪怪的预期之外的现象。

不断变长的列表

最经典的案例当属下面这种不断变长的列表。

def test_default_value(item=["hello"]):print(item)item.append("world")if __name__ == '__main__':test_default_value()  # ['hello']test_default_value()  # ['hello', 'world']test_default_value()  # ['hello', 'world', 'world']

期望

期望当然是希望 item 每次的默认值都是给定的 ["hello"] 。

现象

结果确是后面的运行中,item 使用了前面的运行结果,导致 item 越来越长。

原因

程序会调用定义函数时保存的默认参数,并在上一次的基础上进行操作叠加,即列表在 append 的时候会在 item 原来的基础上 append 追加值,所以导致列表越来越长。

永不变化的时间

import datetime
import timedef test_default_value(start_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")):print(start_time)if __name__ == '__main__':test_default_value()  # 2025-09-30 17:00:35time.sleep(10)test_default_value()  # 2025-09-30 17:00:35time.sleep(10)test_default_value()  # 2025-09-30 17:00:35

期望

期望当然是希望 start_time 每次的默认值都是 datetime.datetime.now() 生成的最新时间。

现象

结果却是 start_time 始终保持第一次生成的时间不变,而不是每次生成当前的最新时间。

原因

默认参数只在函数定义时被计算一次,这个参数在函数被调用时不会被重新计算,所以导致后续运行的 start_time 始终没有再发生变化。

提前生成的时间

import datetime
import timedef test_default_value(start_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")):print(start_time)if __name__ == '__main__':print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))  # 2025-09-30 17:02:51time.sleep(10)test_default_value()  # 2025-09-30 17:02:51time.sleep(10)test_default_value()  # 2025-09-30 17:02:51

期望

期望当然是希望 start_time 每次的默认值都是 datetime.datetime.now() 生成的最新时间。

现象

结果却是 start_time 始终保持程序开始运行的时间,也即这个默认值在函数真正运行前就已经生成好了,而不是在函数运行时才生成

原因

默认参数值在函数被定义时已经计算出来,而不是在函数运行时才开始计算,所以导致上面的时间不是函数运行的时间。

http://www.dtcms.com/a/428019.html

相关文章:

  • 高数第一问:极限定义
  • Vue 3 —— L / 11-Vue3全家桶
  • 建设网站审批手续如何编辑 wordpress 主题
  • SLF4J 日志学习
  • 外贸网站推广中山网站手机模板源码下载
  • 网站后台管理模板免费下载网站建设 人性的弱点
  • nodejs动态创建sql server表
  • 做平面设计什么素材网站好使张家港网站建设优化
  • Java 进阶--函数式编程
  • 《道德经》第九章
  • 网站首页怎么做ps中国营销传播网
  • 镇江网友之家百度上如何做优化网站
  • 网站分辨率自适应代码模板网站定制网站
  • 建设网站的网站安全建设银行网站怎么修改手机号码吗
  • 网站后台可以做两个管理系统么wordpress wpenqueuestyle
  • 两种常见的ACM风格笔试题
  • 图神经网络分享系列-transe(Translating Embeddings for Modeling Multi-relational Data) (一)
  • ENVI系列教程(十九)——目标探测与识别
  • 校园超市网站开发整站优seo排名点击
  • 服务器放n个网站自己做鞋子网站
  • Spring核心 - 控制反转 IOC , 用来大量例子来解释
  • 关键词查询的分析网站有网打不开网页咋回事
  • 大型电子商务网站建设成本双流区的规划建设局网站
  • 从引流到生态:排队免单如何重构商家私域流量?
  • 云网站制作的流程图烟台网站制作厂家联系方式
  • 做视频网站要多大的主机中国建设人才信息网查
  • 网站建设发文章几点发比较合适网站开发 平均工资
  • Android dm设备和分区关系以及文件系统介绍
  • 安卓基础组件013--button
  • @MySQL 主从自动修复 - 复制错误