啥是 python 可变对象 不可变对象?

Python 内存管理

Python 中,一切皆是对象,又分为可变(mutable)和不可变(immutable)对象,二者的区分是是否可以原地修改,原地可以理解为相同的地址。可以通过id()查看一个对象的地址,如果修改对象的值,它的id()没有发生变化,那么就是mutable,否则就是immutable。

>>> a = 5
>>> id(a)
4305313024
>>> a = 6
>>> id(a)
4305313056
>>> lst = []
>>> id(lst)
4367995208
>>> lst.append(1)
>>> id(lst)
4367995208
>>>

a指向的对象(int类型)就是immutable, 赋值语句只是让变量a指向了一个新的对象,因为id发生了变化。
而list指向的对象(list类型)为可变对象,通过方法(append)可以修改对象的值,同时保证id一致。

可变对象:
list 、dict

l = [1, 2, 3] # list
d = {'a': 1, 'b': 2} # dict

不可变对象:
int 、string、float、tuple

i = 0
s = '不可变对象'
f = 99.99
t = (1, 2, 3)

例1:
修改不可变对象tuple,会报错

#定义tuple
t = (1, 'a')
#改变tuple
t[0] = 1
#报错
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

修改list,list改变

#定义list
l = [1, 'a']
#改变tuple
l[0] = '我变了'
print(l)
>>>['我变了', 'a']

例2:
修改不可变对象tuple,发现内容变了,不是说不变吗-。-?

#定义tuple
t = (1, 'a', ['first', 'second'])
#改变tuple
t[2][0] = '我变了'
print(t)
>>>(1, 'a', ['我变了', 'second'])

定义的时候tuple包含的3个元素:


啥是 python 可变对象 不可变对象?_第1张图片
image.png

当把list的元素'first'修改为'我变了'后,tuple变为:

啥是 python 可变对象 不可变对象?_第2张图片
image.png

表面上,输出的tuple元素确实变了,但实际上变的不是tuple,而是list的元素。tuple指向的list并没有改变,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

参考
python3垃圾回收(GC)机制
使用list和tuple

你可能感兴趣的:(啥是 python 可变对象 不可变对象?)