-
python3教程之开发中常遇到的Python陷阱和注意点
本站最新发布 Python从入门到精通|Python基础教程
试听地址 https://www.xin3721.com/eschool/python.html
试听地址 https://www.xin3721.com/eschool/python.html
最近使用Python的过程中遇到了一些坑,例如用datetime.datetime.now()这个可变对象作为函数的默认参数,模块循环依赖等等。
在此记录一下,方便以后查询和补充。
避免可变对象作为默认参数
在使用函数的过程中,经常会涉及默认参数。在Python中,当使用可变对象作为默认参数的时候,就可能产生非预期的结果。
下面看一个例子:
1
2
3
4
5
6
7
|
def append_item(a = 1 , b = []): b.append(a) print b append_item(a = 1 ) append_item(a = 3 ) append_item(a = 5 ) |
结果为:
1
2
3
|
[1] [1, 3] [1, 3, 5] |
从结果中可以看到,当后面两次调用append_item函数的时候,函数参数b并没有被初始化为[],而是保持了前面函数调用的值。
之所以得到这个结果,是因为在Python中,一个函数参数的默认值,仅仅在该函数定义的时候,被初始化一次。
下面看一个例子证明Python的这个特性:
1
2
3
4
5
6
7
8
9
|
class Test( object ): def __init__( self ): print ( "Init Test" ) def arg_init(a, b = Test()): print (a) arg_init( 1 ) arg_init( 3 ) arg_init( 5 ) |
结果为:
1
2
3
4
|
Init Test 1 3 5 |
从这个例子的结果就可以看到,Test类仅仅被实例化了一次,也就是说默认参数跟函数调用次数无关,仅仅在函数定义的时候被初始化一次。
可变默认参数的正确使用
对于可变的默认参数,我们可以使用下面的模式来避免上面的非预期结果:
1
2
3
4
5
6
7
8
9
|
def append_item(a = 1 , b = None ): if b is None : b = [] b.append(a) print b append_item(a = 1 ) append_item(a = 3 ) append_item(a = 5 ) |
栏目列表
最新更新
python数据库连接池技术总结
python数据库连接池技术总结
成人网站性能提升 20 倍之经验谈 [Python
python动态捕获异常
python 探测网站目录的GUI程序
python实现中文字符繁体和简体中文转换
Python服务器开发 -- 网络基础
python高性能编程方法一
使用python管理Cisco设备
python抓取google搜索结果
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
图解TCP数据报结构以及三次握手(非常详
TCP协议的粘包问题(数据的无边界性)
Excel数据导入到Sql server
SQL Server like 字段
SQL Server中的LEFT、RIGHT函数
sql server 安装出现需要sqlncli.msi文件,错误
SQL Server学习内容(一)
SQLServer执行大脚本文件时,提示“无法执
数据库敏捷版本控制之3个数据库策略
将select 转为json
SQL Server 创建索引(index)
GROUP BY中的WITH CUBE、WITH ROLLUP原理测试及