前几天,运营反馈了一个BUG,某些数据在写入数据库后,其时间字段出现异常,与当前时间相差较多。

由于代码是不是我写的,所以开始一遍阅读代码一遍排查问题。

在主流程中,仅仅发现了一个对时间赋值的语句,并且赋值使用的是data.CreateTime=int(time.time())这样的形式,应该没有问题。

在别的地方没有找到对该字段赋值的操作,于是想看看这个类是不是自身有什么方法会修改时间字段。

最终在类初始化函数中找到了这样的内容

1 classData():2 def __init__(a, b=None, CreateTime=int(time.time())):3 self.a =a4 self.b =b5 self.CreateTime = CreatTime

问题就出现在这里,在Python官方文档中有这么一句话:

Default parameter values are always evaluated when, and only when, the “def” statement they belong to is executed.

意思是,默认参数始终在且仅在函数定义时赋值一次,所以上面的代码造成的问题是,如果该类在实例化时没有传入Creatime参数,则其CreateTime参数会默认为程序启动的时间。

另外,如果参数默认值是可变对象,那么会出现另外一个问题,如果函数修改了这个对象,那么默认值也会被修改。

This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified.

如果写出了如下代码:

def f(a, L=[]):

L.append(a)returnLprint f(1)print f(2)print f(3)

则其输出为:

[1]

[1, 2]

[1, 2, 3]

那么如何解决这个问题呢?

一般情况下,推荐的解决方式是,使用None作为参数的默认值,然后进行判断,如果发现参数为None,则重新对其进行赋值。

对于最开始的例子,解决之后的代码如下:

1 classData():2 def __init__(a, b=None, CreateTime=None):3 self.a =a4 self.b =b5 self.CreateTime = int(time.time()) if CreateTime is None else CreateTime

python函数默认参数_Python中函数的默认参数问题相关推荐

  1. python可变参数函数二阶导数公式_python中函数的可变参数

    简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...

  2. python可变参数函数二阶导数公式_Python中函数的参数定义和可变参数

    刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函 ...

  3. python中函数的可变参数_Python中函数的参数定义和可变参数

    转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html 刚学用Python的时候,特别是看一些库的源码时,经常会看到fun ...

  4. python函数**什么意思_python中函数的参数是什么意思

    本文主要讲解python中函数的参数及参数的类型 默认参数def enroll(name, gender, age=6, city='Beijing'): print('name:', name) p ...

  5. python收集参数_Python 中函数的 收集参数 机制

    定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...

  6. python函数可变参数_python中函数的可变参数

    知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 本节视频教程 文字教程开始: 一.[其实已经用过]可变参数 回顾系统自带的可变参数函数print #系统自带的可变参数函数 ...

  7. python 内部函数传参_python中函数传参详解

    一.参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple: 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict: 1. 传入可变参数: def ca ...

  8. python中的方法和函数的区别_Python中函数和方法的区别

    在Python中函数和方法是有区别的. 区别一所处的位置:函数是直接写文件中而不是class中,方法是只能写在class中. 区别二定义的方式: 1.函数定义的方式 def关键字  然后接函数名 再是 ...

  9. python函数可选参数传递_Python中函数的参数传递

    1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add ...

最新文章

  1. 根据sql生成相应字段
  2. sql server中的decimal或者numeric的精度问题 (转载)
  3. 下载linux操作系统一般的初始账号密码(虚拟机)
  4. 【阿里云课程】详解深度学习优化:参数初始化,激活函数,标准化,池化
  5. GitHub 基本常用知识解答2
  6. mysql replace first_Java replaceFirst()方法
  7. 前端遇上Go: 静态资源增量更新的新实践
  8. 系统管理员最应该读的5本书_系统管理员的8本书
  9. 【clickhouse】clickhouse INSERT INTO 语句
  10. [2010-8-24]
  11. 蚂蚁集团回应与腾讯微信支付竞争;华为余承东:鸿蒙现达到安卓70-80%水平;C++20 标准草案获批准| 极客头条
  12. 物联网网络编程、Web编程综述
  13. 虚拟机VMware安装ubuntu教程
  14. 全裸或半裸的大肚照国际接轨 细数女星大尺度斗艳孕照
  15. 菊风携手麦瑞思与Takumi实现中国首个北美运营商Verizon的RCS入库成功案例
  16. 驱动里面如何操作regulator
  17. revit二次开发 创建标注标记
  18. 【Hadoop】Hadoop Snappy 安装 (Ubuntu 16.04)
  19. 如何用移动硬盘备份计算机,怎么自动备份电脑资料到移动硬盘
  20. 【kafka】二、kafka安装

热门文章

  1. 强制应用 AMP 工具,开发者欲“封杀” Google!
  2. TIOBE 6 月编程语言排行榜:Perl 成为 Python 过分炒作的牺牲品?
  3. 果断 Mark!27 个免费、低成本 Python 学习资源入手!
  4. 看动画轻松理解「Trie树」
  5. 滴滴顺风车春运暂不上线;锤子员工被强制离职;苹果聘请三星高管 | 极客头条...
  6. CSDN 创始人蒋涛:AI 定义的开发者时代
  7. Linux 进入 5.0 时代!
  8. 为什么 ofo 彻底凉了?| 畅言
  9. 程序员过了 30 岁就没人要了?!
  10. Windows Notepad 居然要迎来大更新了!