龙空技术网

python 可变对象和不可变对象

热衷python和前端 274

前言:

此刻同学们对“python中的可变对象”大约比较注重,大家都想要学习一些“python中的可变对象”的相关知识。那么小编也在网络上网罗了一些有关“python中的可变对象””的相关知识,希望你们能喜欢,姐妹们快快来了解一下吧!

可变对象:`dict, list, set`

不可变对象:`tuple, string, int, float, bool`

这里的可变不可变指的是内存地址中存储的数据

可变对象

>>> a = [1]>>> id(a)4386390152>>> a.append(2)>>> a[1, 2]>>> id(a)4386390152

`id()`方法返回对象的内存地址(逻辑上的地址,并不是实际物理的地址)

从中可以看到修改列表,但是内存地址并没有改变,说明我们将内存当中存储的数据进行了修改

不可变对象

>>> b = 10>>> id(b)4384244160>>> b = 10 + 1>>> b11>>> id(b)4384244192

可以看到,我们并没有修改内存中存储的数据,而是引用了另外一个片内存,由于Python有小整数缓冲池,所以原来存储10的内存片不会被垃圾回收

作为函数参数

>>> def myfunc(l):... l.append(1)... print(l)...>>> l = [1, 2, 3]>>> myfunc(l)[1, 2, 3, 1]>>> l[1, 2, 3, 1]

可变对象当函数参数传入,并在函数内部进行修改时会修改全局变量的,因为在函数内部修改可变对象,就直接修改了内存中存储的数据

>>> def myfunc(a):... a += 1... print(a)...>>> a = 2>>> myfunc(a)3>>> a2

不可变对象当函数参数传入,在函数内部修改并不会修改内存中的数据,所以全局变量指向的内存还是原来的数据

可变对象当函数的默认参数是有问题的

>>> def myfunc(a=[]):... a.append('test')... print(a)...>>> myfunc()['test']>>> myfunc()['test', 'test']>>> myfunc()['test', 'test', 'test']

由于函数在定义的时候,默认参数a的值就被计算出来了,它指向[]对应的内存地址,我们修改了a,也就是修改了[]对应内存地址当中的数据,当后面再次调用函数时,[]对应内存当中的数据已经变了。

解决办法:

>>> def myfunc(a=None):... if a is None:... a = []... a.append('test')... print(a)...>>> myfunc()['test']>>> myfunc()['test']

标签: #python中的可变对象