
正文
python函数可变类型,Python的可变类型和不可变类型?
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
python中变量的引用、可变和不可变类型、局部变量和全局变量
变量的引用
变量和数据都是保存在内存中的
变量和数据是分开存储的
数据保存在内存中某个位置,通过地址来标记
变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置
把变量保存数据地址的过程称为引用
变量的重新赋值修改的是变量中引用数据的内存地址
变量之间的赋值实际是引用的传递
函数参数的传递,本质也是引用的传递
函数的返回值本身也是引用的传递
可变和不可变类型
不可变类型,内存中的数据不允许被修改:数字类型(int,bool,float,complex,long(2,x)、字符串、元组(tuple)
可变类型,内存中的数据可以被修改:列表list、字典dict
无论是可变还是不可变数据类型,通过赋值语句,都会改变变量的引用
Hash函数只能接收不可变数据类型,字典的键也只能是不可变数据类型,字典的value值可以是任意数据类型
局部变量
1.在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部)
2.在函数外部无法直接访问局部变量
3.不同的函数中可以定义同名的局部变量
4.局部变量的生命周期:从定义变量时开始,到函数运行结束
全局变量
1.在所有函数外边定义的变量就是全局变量
2.让所有函数都能访问到,可以作为函数通信的桥梁
3.一般情况下,为了和普通变量的区别,需要加上g_或gl_前缀
4.全局变量一般放在所有函数的最上面
5.在函数内部修改全局变量,必须要加上global关键字,如果不加global只是定义了一个同名的局部变量
函数的多个返回值
相关问答
Q1: python变量的可变与不可变类型
(1)数字类型(int,float, bool,complex)
(2)字符串(str)
(3)元组(tuple)
(1)列表(list)
(2)字典(dict)
示例-不可变类型:
结果:
示例-可变类型:
结果:
示例1:
结果:
示例2:
结果:
hash(object) 返回对象的哈希值。
(1)只能接受不可变类型的数据作为参数
(2)返回的是一个整数,是数据的唯一特征码(就像人的指纹一样)
(3)在python中,设置字典键值对时,会首先对key进行hash,用来决定如何在内存中保存字典的数据,以方便后续对字典进行增删改查;
Q2: 软件测试中,python可变数据类型和不可变数据类型?
不可变数据类型的就是内存中不管有多少个引用,相同的对象只占用了一块内存,但是它的缺点就是当需要对变量进行运算从而改变变量引用的对象的值时,由于是不可变的数据类型,所以必须创建新的对象,这样就会使得一次次的改变创建了一个个新的对象,不过不再使用的内存会被垃圾回收器回收。
其实其他语言,比如java也有类似的功能,就是一些基础的数字,例如前256个,都是固定在静态区的某个位置的,而不会随着指针变量的变化,而导致所指向的地址变化。
Q3: python 可变不可变类型
python的数据类型和c不太一样,有一种分类标准,可变(mutable)/不可变(immutable).
我理解的可变,就是在内存中的那块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
不可变类型:string,integer,tuple
var1 = 1
var2 = var1
var1,var2
(1, 1)
id(var1),id(var2) #同指同一内存区域,id相同
(21200672, 21200672)
var1 += 1
var1,var2
(2, 1)
id(var1),id(var2)#由于var1,var2数据不可变的,对var1+1后,申请另外一块区域,id(var1)变了,id(var2)不变,对此区域ref数字-1
(21200660, 21200672)
可变类型:list,dict
lst1 = [1,2,3]
lst2 = lst1
lst1,lst2
([1, 2, 3], [1, 2, 3])
id(lst1),id(lst2)
(28497360, 28497360)
lst1.append(4)#可变类型的,append后,address会保持不变
lst1,lst2
([1, 2, 3, 4], [1, 2, 3, 4])
id(lst1),id(lst2)#lst1,lst2一直指向同一区域
(28497360, 28497360)
在操作这种类型的时候要特别小心,dict的key不用可变类型的,函数传参的时候不用可变类型的。
eg:
def dis(arg=[]):
... arg.append('1')
... print arg
...
dis()
['1']
dis()
['1', '1']
dis()
['1', '1', '1']
参考copy模块,了解更多。
==over==
Q4: 在Python中,函数定义为def+vfun(a,**b):……,则可变参数b的类型是?
在函数的参数列表里,参数名前带两个"*"的参数是字典类型。vfun函数的调用里,a后的参数都必须使用关键字传参,它们作为键值对存到字典b
Q5: python中可变类型的增,删,查,改方法会改变原序列吗
会改变。列表是一种可变类型的数据结构,即可以实现对列表的修改,包括增加、删除和修改列表中的元素值。






