可变数据类型作为初始化形参 / 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,也就将值进行了重新的初始化。

最新文章

  1. thinkphp判断是否登录
  2. js对Cookie的读写操作
  3. 今天写项目时,突然发现canvas的一些公式不记得了,所以整理了一番,分享给大家。
  4. 打造基于CentOS7的xfce最简工作环境
  5. 几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)
  6. 【Cocos2d实例教程一】xcode5下Cocos2d环境的搭建
  7. C# 读取oracle 中文乱码的解决方案
  8. jquery解析XML(1)
  9. 使用Eclipse创建模板并格式化代码
  10. jquery与ajax的应用
  11. 微软推荐的130道ASP.NET常见面试题及答案
  12. 5月,专用程序猿的经典大作——APUE
  13. hdu_4714_Tree2cycle(树形DP)
  14. JQ 放大镜
  15. Kafka从入门到进阶
  16. Cinder组件解析
  17. PHP非常好用的分页类
  18. Git使用教程(转载)
  19. Spring学习笔记:Spring动态组装打印机
  20. 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)

热门文章

  1. 《数据结构与算法分析:C语言描述》复习——第三章“线性表、栈和队列”——双向链表
  2. 《Cracking the Coding Interview》——第16章:线程与锁——题目5
  3. python学习笔记十二:类的定义
  4. 【Search in Rotated Sorted Array II 】cpp
  5. ACM二分搜索算法
  6. POJ 3348 Cows | 凸包模板题
  7. Windows域同步检查repadmin
  8. web本地存储 sessionStorage 和 localStorage
  9. 洛谷P3112 [USACO14DEC]后卫马克Guard Mark
  10. 关于each()、find()、filter()遍历节点的操作方法