可变数据类型作为初始化形参 / 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. 《数据结构与算法分析:C语言描述》复习——第九章“图论”——拓扑排序

    2014.07.04 17:23 简介: 我们考虑一种特殊的图: 1. 有向图 2. 只有一个连通分量 3. 不存在环 那么这样的图里,必然可以找到一种排序方式,来确定谁在谁的“前面”. 简单的来说可 ...

  2. NOIP2018 集训(二)

    A题 神炎皇 问题描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 \((a,b)\) ,若满足 \(a+b\leq n\) 且 \(a+b\) 是 \(ab\) 的因子,则称 为神 ...

  3. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  4. Tensorflow实现LSTM识别MINIST

    import tensorflow as tf import numpy as np from tensorflow.contrib import rnn from tensorflow.exampl ...

  5. ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory

    这是在python中使用caffe产生的错误. 程序很普通: #-*-coding=utf-8-*- import numpy as npimport matplotlib.pyplot as plt ...

  6. 更优雅的清除浮动float方法

    上篇文章是利用 :after 方法清除浮动float(作用于浮动元素的父元素上). ; } //为了兼容性,因为ie6/7不能使用伪类,所以加上此行代码. .outer:after {;;visibi ...

  7. BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)

    [HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...

  8. P4342 [IOI1998]Polygon

    题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...

  9. BZOJ2763 [JLOI2011]飞行路线 【分层图 + 最短路】

    题目 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格 ...

  10. 【转发】Build Squid with SSL Bump and ICAP Client

    原文文档:http://docs.diladele.com/administrator_guide_3_4/installation_and_removal/filtering_https.html ...