小议Python中自定义函数的可变参数的使用及注意点


Posted in Python onJune 21, 2016

可变参数

Python的可变参数有两种,一种是列表类型,一种是字典类型。列表类型类似 C 中的可变参数,定义方式为

def test_list_param(*args) :
  for arg in args :
    print arg

其中 args 是一个 tuple。
字典类型的可变参数:

def test_dict_param(**args) :
  for k, v in args.iteritems() :
    print k, v

其中 args 是一个 dictionary
可以分别传递 tuple 和 dictionary 给相应的可变参数,格式如下

a = (1, 2, 3)
b = {"a":1, "b":2, "msg":"hello"}
test_list_param(*a)
test_dict_param(**b)

带默认参数的函数

函数的带默认值参数能够很大程度上方便我们使用:一般情况下可以省略传参使用参数的默认值,也可以主动传参;调用的时候也不用在意参数的顺序方便使用,并且直接、显式;甚至还能用来当作魔法值,做一些逻辑上的控制。

但是由于python的默认值参数只会在函数定义处被解析一次,此后每次调用函数的时候,默认值参数都会是这个值了。碰到一些不可变的数据类型比如:整型,字符串,元祖之类的还好,但如果碰到可变类型的数据比如数组的话,就会有发生一些意想不到的事情。
让我们举一个简单的例子说明一下:

def add_to(num, target=[]):
  target.append(num)
  print id(target), target

add_to(1)
# Output: 39003656, [1]
add_to(2)
# Output: 39003656, [1, 2]
add_to(3)
# Output: 39003656, [1, 2, 3]

很显然如果你是想每次调用函数都能得到一个新的包含期望结果的数组,肯定不能如愿了。函数add_to的参数target在函数第一次被解析的时候会被赋值成空的数组,因为只会被解析一次,以后每次调用的时候都会在这个target变量的基础上进行操作,变量的id值也完全一样。想要得到预期的结果,可以为这种可变数据类型的参数指定一个None来表示空值:

a = (1, 2, 3)
b = {"a":1, "b":2, "msg":"hello"}
test_list_param(*a)
test_dict_param(**b)

在python的世界里,参数是按标识符传递(粗暴点解释就是按引用传递的),你需要担心的是参数的类型是否是可变的:

>>> def test(param1, param2):
...   print id(param1), id(param2)
...   param1 += 1
...   param2 += 1
...   print id(param1), id(param2)
...
>>> var1 = 1
>>> var2 = 2
>>> print id(var1), id(var2)
36862728 36862704
>>> test(var1, var2)
36862728 36862704
36862704 36862680

可变的数据类型,函数局部作用域里面的任何改变会保留在数据上;不可变的数据类型,发生的任何改变都只会体现在新生成的局部变量上,如同上面的列子中所示的效果,读者可以对比一下。

Python 相关文章推荐
归纳整理Python中的控制流语句的知识点
Apr 14 Python
python实现ping的方法
Jul 06 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
python实现测试工具(一)——命令行发送get请求
Oct 19 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 #Python
Python编程中实现迭代器的一些技巧小结
Jun 21 #Python
Centos Python2 升级到Python3的简单实现
Jun 21 #Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 #Python
Python正则表达式使用经典实例
Jun 21 #Python
常见的python正则用法实例讲解
Jun 21 #Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 #Python
You might like
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
使PHP自定义函数返回多个值
2006/11/26 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
学习ExtJS Window常用方法
2009/10/07 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
JavaScript String 对象常用方法总结
2016/04/28 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
python中count函数简单用法
2020/01/05 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
实用求职信范文分享
2013/12/25 职场文书
小学运动会表扬稿
2014/01/19 职场文书
综合实践活动方案
2014/02/14 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
导游词之麻姑仙境
2019/11/18 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫