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 "<stdin>", line 1, in <module>
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个元素:
image.png
当把list的元素'first'
修改为'我变了'
后,tuple变为:
表面上,输出的tuple元素确实变了,但实际上变的不是tuple,而是list的元素。tuple指向的list并没有改变,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
网友评论