Python_Tips[5] -> 可变数据类型作为初始化形参
2024-09-04 18:06:11
可变数据类型作为初始化形参 / Mutable Parameter as Init Formal-para
由于在Python中,没有类似C语言的static静态参数,因此当一个函数需要一个只初始化一次的参数时,通常会在函数外部进行初始化操作,较为不便。
但是在Python中,可以利用可变参数作为函数的形参默认值来实现这一功能,
完整代码
# n is mutable
def foo_1(x, n=[]):
print(id(n))
n += [x]
print(id(n))
print(n) foo_1(2)
foo_1(3)
foo_1(5) print(20*'-')
# n is immutable
def foo_2(x, n=()):
print(id(n))
n += (x, )
print(id(n))
print(n) foo_2(2)
foo_2(3)
foo_2(5)
分段解析
首先,定义了一个函数,其中形参n的默认值为可变类型的list,在函数中,首先查看n的id,随后对n进行操作,添加传入的参数值,再次查看n的id以及n的值。
# n is mutable
def foo_1(x, n=[]):
print(id(n))
n += [x]
print(id(n))
print(n) foo_1(2)
foo_1(3)
foo_1(5)
利用3个数进行测试,输出结果
55021192
55021192
[2]
55021192
55021192
[2, 3]
55021192
55021192
[2, 3, 5]
从输出的结果中可以看到,3次函数调用的n都是同一个id,同时,n的值也并未在每次函数进入时重新初始化,也就是说,参数n在每次调用时都会进行重指向,指向初始化的值的地址。但是,由于n指向的是个可变的列表,因此当n所指向的值被改变了之后,n再次重指向该地址时,该地址的值即是改变之后的值。
接下来利用不可变的元组进行测试,同样进行上面类似的操作。
# n is immutable
def foo_2(x, n=()):
print(id(n))
n += (x, )
print(id(n))
print(n) foo_2(2)
foo_2(3)
foo_2(5)
输出结果
4456520
52583336
(2,)
4456520
16619168
(3,)
4456520
52583336
(5,)
从最终的输出可以看到,与列表不同的是,每次输出的元组都是该次传入的元素。通过查看元组的id可知,由于元组是不可变的,因此每次进行添加操作时,实际上都是将元组进行了重新指向,而原本的空元组并未被修改,所以,再次进入函数时,参数n重新指向空元组的id,也就将值进行了重新的初始化。
最新文章
- thinkphp判断是否登录
- js对Cookie的读写操作
- 今天写项目时,突然发现canvas的一些公式不记得了,所以整理了一番,分享给大家。
- 打造基于CentOS7的xfce最简工作环境
- 几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)
- 【Cocos2d实例教程一】xcode5下Cocos2d环境的搭建
- C# 读取oracle 中文乱码的解决方案
- jquery解析XML(1)
- 使用Eclipse创建模板并格式化代码
- jquery与ajax的应用
- 微软推荐的130道ASP.NET常见面试题及答案
- 5月,专用程序猿的经典大作——APUE
- hdu_4714_Tree2cycle(树形DP)
- JQ 放大镜
- Kafka从入门到进阶
- Cinder组件解析
- PHP非常好用的分页类
- Git使用教程(转载)
- Spring学习笔记:Spring动态组装打印机
- 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)
热门文章
- 《数据结构与算法分析:C语言描述》复习——第三章“线性表、栈和队列”——双向链表
- 《Cracking the Coding Interview》——第16章:线程与锁——题目5
- python学习笔记十二:类的定义
- 【Search in Rotated Sorted Array II 】cpp
- ACM二分搜索算法
- POJ 3348 Cows | 凸包模板题
- Windows域同步检查repadmin
- web本地存储 sessionStorage 和 localStorage
- 洛谷P3112 [USACO14DEC]后卫马克Guard Mark
- 关于each()、find()、filter()遍历节点的操作方法