前言:
此刻同学们对“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中的可变对象