Python_Tips[5] -> 可变数据类型作为初始化形参

可变数据类型作为初始化形参 / Mutable Parameter as Init Formal-para



由于在Python中,没有类似C语言的static静态参数,因此当一个函数需要一个只初始化一次的参数时,通常会在函数外部进行初始化操作,较为不便。

但是在Python中,可以利用可变参数作为函数的形参默认值来实现这一功能,

完整代码

 1 # n is mutable
 2 def foo_1(x, n=[]):
 3     print(id(n))
 4     n += [x]
 5     print(id(n))
 6     print(n)
 7
 8 foo_1(2)
 9 foo_1(3)
10 foo_1(5)
11
12 print(20*‘-‘)
13 # n is immutable
14 def foo_2(x, n=()):
15     print(id(n))
16     n += (x, )
17     print(id(n))
18     print(n)
19
20 foo_2(2)
21 foo_2(3)
22 foo_2(5)

分段解析

首先,定义了一个函数,其中形参n的默认值为可变类型的list,在函数中,首先查看n的id,随后对n进行操作,添加传入的参数值,再次查看n的id以及n的值。

 1 # n is mutable
 2 def foo_1(x, n=[]):
 3     print(id(n))
 4     n += [x]
 5     print(id(n))
 6     print(n)
 7
 8 foo_1(2)
 9 foo_1(3)
10 foo_1(5)

利用3个数进行测试,输出结果

55021192
55021192
[2]
55021192
55021192
[2, 3]
55021192
55021192
[2, 3, 5]

从输出的结果中可以看到,3次函数调用的n都是同一个id,同时,n的值也并未在每次函数进入时重新初始化,也就是说,参数n在每次调用时都会进行重指向,指向初始化的值的地址。但是,由于n指向的是个可变的列表,因此当n所指向的值被改变了之后,n再次重指向该地址时,该地址的值即是改变之后的值。

接下来利用不可变的元组进行测试,同样进行上面类似的操作。

 1 # n is immutable
 2 def foo_2(x, n=()):
 3     print(id(n))
 4     n += (x, )
 5     print(id(n))
 6     print(n)
 7
 8 foo_2(2)
 9 foo_2(3)
10 foo_2(5)

输出结果

4456520
52583336
(2,)
4456520
16619168
(3,)
4456520
52583336
(5,)  

从最终的输出可以看到,与列表不同的是,每次输出的元组都是该次传入的元素。通过查看元组的id可知,由于元组是不可变的,因此每次进行添加操作时,实际上都是将元组进行了重新指向,而原本的空元组并未被修改,所以,再次进入函数时,参数n重新指向空元组的id,也就将值进行了重新的初始化。

原文地址:https://www.cnblogs.com/stacklike/p/8227666.html

时间: 2024-07-30 03:54:01

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

python全栈开发【第五篇】Python可变数据类型和不可变数据类型

1.可变数据类型:在id不变的情况下,value可改变(列表和字典是可变类型,但是字典中的key值必须是不可变类型) 2.不可变数据类型:value改变,id也跟着改变.(数字,字符串,布尔类型,都是不可类型) 原文地址:https://www.cnblogs.com/xiaohema/p/8452966.html

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

背景: 探寻python的数据类型是否可变,也可以更好的理解python对内存的使用情况. 可变与不可变定义       可变数据类型:在python中定义一个变量,当变量值被修改后,内存地址未变更(对象未变更),则将该数据定义为可变数据类型. 可不变数据类型:当变量数值被修改后,变量的内存地址发生变更(创建了新对象),则认为是不可变数据类型. 针对python数据类型进行测试: 数字: >>> a = 111 >>> id(a) 1549733776 >>

Python基础--可变数据类型与不可变数据类型

可变数据类型与不可变数据类型 Python的数据类型主要分为可变数据类型与不可变数据类型,这两种都分别包含了哪些数据类型又各自有什么特点呢我们下边意义介绍: 不可变数据类型:数字.字符串.元组是不可变的 可变数据类型:列表.字典是可变的; 不可变数据类型举例 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收) i = 5 i += 1 print(i) #不可变类型以int

可变与不可变数据类型详解

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

python中的可变数据类型和不可变数据类型

1.不可变数据类型:数值.字符串.元组 不允许变量的值发生变化,如果变量的值变化了,那么就是新建了一个对象:对于相同值的对象,在内存中只有一个对象. 2.可变数据类型:列表.字典 允许变量的值发生变化,允许变量的值发生变化,即如果对变量进行append.+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象

python | 不可变数据类型

目录 第1节 分类 第2节 不可变数据类型 2.1 布尔型(bool) 2.2 数字型(number) 2.3 字符串(string) 2.4 元组(tuple) 第1节 分类 python中有7种标准数据类型,分别是布尔型.数字型.字符串.元组.列表.字典和集合,根据数据的特点,可以划分为两大类:不可变数据类型.可变数据类型,见下图: 而不同数据类型,内部的组成元素,经常可以是其他的数据类型,即可以互相嵌套,见下图: 第2节 不可变数据类型 2.1 布尔型(bool) 布尔型数据也叫布尔值,只

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

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

探索c#之不可变数据类型

阅读目录: 不可变对象 自定义不可变集合 Net提供的不可变集合 不可变优点 不可变对象缺点 不可变对象 不可变(immutable): 即对象一旦被创建初始化后,它们的值就不能被改变,之后的每次改变都会产生一个新对象. var str="mushroomsir"; str.Substring(0, 6) c#中的string是不可变的,Substring(0, 6)返回的是一个新字符串值,而原字符串在共享域中是不变的.另外一个StringBuilder是可变的,这也是推荐使用Stri

列出python中可变数据类型和不可变数据类型,并简述原理

可变类型(mutable):变量进行append.+=等这种操作后 == 改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象. list dict set bytearray user-defined classes (除非是特别定义的不可变) a = [1,2] b = [1,2] print(id(a)) print(i