python函数默认参数_Python中函数的默认参数问题
前几天,运营反馈了一个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中函数的默认参数问题相关推荐
- python可变参数函数二阶导数公式_python中函数的可变参数
简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...
- python可变参数函数二阶导数公式_Python中函数的参数定义和可变参数
刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函 ...
- python中函数的可变参数_Python中函数的参数定义和可变参数
转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html 刚学用Python的时候,特别是看一些库的源码时,经常会看到fun ...
- python函数**什么意思_python中函数的参数是什么意思
本文主要讲解python中函数的参数及参数的类型 默认参数def enroll(name, gender, age=6, city='Beijing'): print('name:', name) p ...
- python收集参数_Python 中函数的 收集参数 机制
定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...
- python函数可变参数_python中函数的可变参数
知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 本节视频教程 文字教程开始: 一.[其实已经用过]可变参数 回顾系统自带的可变参数函数print #系统自带的可变参数函数 ...
- python 内部函数传参_python中函数传参详解
一.参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple: 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict: 1. 传入可变参数: def ca ...
- python中的方法和函数的区别_Python中函数和方法的区别
在Python中函数和方法是有区别的. 区别一所处的位置:函数是直接写文件中而不是class中,方法是只能写在class中. 区别二定义的方式: 1.函数定义的方式 def关键字 然后接函数名 再是 ...
- python函数可选参数传递_Python中函数的参数传递
1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add ...
最新文章
- 根据sql生成相应字段
- sql server中的decimal或者numeric的精度问题 (转载)
- 下载linux操作系统一般的初始账号密码(虚拟机)
- 【阿里云课程】详解深度学习优化:参数初始化,激活函数,标准化,池化
- GitHub 基本常用知识解答2
- mysql replace first_Java replaceFirst()方法
- 前端遇上Go: 静态资源增量更新的新实践
- 系统管理员最应该读的5本书_系统管理员的8本书
- 【clickhouse】clickhouse INSERT INTO 语句
- [2010-8-24]
- 蚂蚁集团回应与腾讯微信支付竞争;华为余承东:鸿蒙现达到安卓70-80%水平;C++20 标准草案获批准| 极客头条
- 物联网网络编程、Web编程综述
- 虚拟机VMware安装ubuntu教程
- 全裸或半裸的大肚照国际接轨 细数女星大尺度斗艳孕照
- 菊风携手麦瑞思与Takumi实现中国首个北美运营商Verizon的RCS入库成功案例
- 驱动里面如何操作regulator
- revit二次开发 创建标注标记
- 【Hadoop】Hadoop Snappy 安装 (Ubuntu 16.04)
- 如何用移动硬盘备份计算机,怎么自动备份电脑资料到移动硬盘
- 【kafka】二、kafka安装
热门文章
- 强制应用 AMP 工具,开发者欲“封杀” Google!
- TIOBE 6 月编程语言排行榜:Perl 成为 Python 过分炒作的牺牲品?
- 果断 Mark!27 个免费、低成本 Python 学习资源入手!
- 看动画轻松理解「Trie树」
- 滴滴顺风车春运暂不上线;锤子员工被强制离职;苹果聘请三星高管 | 极客头条...
- CSDN 创始人蒋涛:AI 定义的开发者时代
- Linux 进入 5.0 时代!
- 为什么 ofo 彻底凉了?| 畅言
- 程序员过了 30 岁就没人要了?!
- Windows Notepad 居然要迎来大更新了!