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

Python_Tips[5] -> 可变数据类型作为初始化形参的更多相关文章

  1. python 可变数据类型&不可变数据类型

    在python中,数据类型分为可变数据类型和不可变数据类型,不可变数据类型包括string,int,float,tuple,可变数据类型包括list,dict. 所谓的可变与不可变,举例如下: > ...

  2. python3可变与不可变数据类型

    Python3中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Dictionary(字典) Tuple(元组) Set(集合) 我理解的可变就是当一个变量创建 ...

  3. python基础之可变数据类型与不可变数据类型

    一.什么可变数据类型和不可变数据类型 可变数据类型:value值改变,id值不变:不可变数据类型:value值改变,id值也随之改变. 二.如何确定一种数据类型是可变的还是不可变的 根据可变数据类型与 ...

  4. 可变数据类型&不可变数据类型

    不同的变量在内存中有不同的存储空间,每个存储空间都有一个ID >>> a = 32 >>> id(a) # 查看ID 1571185856 >>> ...

  5. python中不可变数据类型和可变数据类型

    在学习python过程中我们一定会遇到不可变数据类型和可变数据类型. 1.名词解释 以下所有的内容都是基于内存地址来说的. 不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址 ...

  6. python的可变与不可变数据类型

    <python的可变与不可变数据类型>     python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象的引用”这句话,其 ...

  7. python3-可变和不可变数据类型

    可变:[ ]    { } 不可变:int    str   ( )     应用实例: 把列表l,追加到列表s中,现在网列表l中追加一个5,打印列表s可以看到,列表s中的列表l中也有5. d={&q ...

  8. python的可变数据类型和不可变类型

    python里面一切皆对象 ython的每个对象都分为可变类型和不可变类型 整形,浮点型,字符串,元组属于不可变类型,列表,字典是可变类型 不可变数据类型 对不可变类型的变量重新赋值,实际上是重新创建 ...

  9. Python中可变数据类型和不可变数据类型

    首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型.可变数据类型:列表list和字典dict:不可变数据类型:整型int.浮点型float.字符串型string和元组tuple ...

随机推荐

  1. 剑指Offer - 九度1518 - 反转链表

    剑指Offer - 九度1518 - 反转链表2013-11-30 03:09 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试 ...

  2. python学习总结---面向对象2

    面向对象三大特点 - 封装:既是对数据结构的封装,有是处理数据的方法的封装. - 继承:强调的父子类的关系. - 多态:不同对象调用相同的方法,有不同的响应. 类的继承 - 相关概念 - 继承:父类的 ...

  3. 孤荷凌寒自学python第二十一天初识python的类

    孤荷凌寒自学python第二十一天初识python的类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 类是面向对象的编程语言非常重要的概念. 编程语言的进化史中从顺序编程到结构化编程,最后才 ...

  4. shell之ip命令

    转:出处我也不知道了,学习时候记下的笔记 1.作用 ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户. ...

  5. [ARC068F] Solitaire [DP]

    题面 传送门 思路 单调性 首先,显然可以发现这些数在放进双端队列之后肯定是一个$V$形的排布:1在最中间,两边的数都是单调递增 那么我们拿出来的数,显然也可以划分成2个单调递减的子序列(因为我们也是 ...

  6. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  7. POJ 1064 Cable master | 二分+精度

    题目: 给n个长度为l[i](浮点数)的绳子,要分成k份相同长度的 问最多多长 题解: 二分长度,控制循环次数来控制精度,输出也要控制精度<wa了好多次> #include<cstd ...

  8. POJ 2074 | 线段相交

    #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #defi ...

  9. 用Spring注解的方式实现对某个网页的访问

    本案例的目标是加强对@Controller   @RequestMapping  @Resource  @Service 的感性认识,能过知道这几个注解是怎么用的,以及spring和springmvc ...

  10. Python之多线程:Threading模块

    1.Threading模块提供的类 Thread,Lock,Rlock,Condition,Semaphore,Event,Timer,local 2.threading模块提供的常用的方法 (1)t ...