美文网首页
啥是 python 可变对象 不可变对象?

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

作者: 来一碗花甲粉 | 来源:发表于2019-04-27 08:54 被阅读0次

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变为:

image.png

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

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

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

相关文章

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

    Python 内存管理 Python 中,一切皆是对象,又分为可变(mutable)和不可变(immutable)...

  • Python浅拷贝 深拷贝

    内存泄漏太可怕。 Python 可变对象 & 不可变对象 在Python中,对象分为两种:可变对象和不可变对象。 ...

  • python可变和不可变对象

    python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float...

  • Python中的可变对象和不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改...

  • python中可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象。 所谓可变对象是指,对象的内容可变,而不可变对象...

  • python可变对象和不可变对象

    Python在heap中分配的对象分为两类:可变对象和不可变对象。 可变对象:list,dict 不可变对象:in...

  • python 可变对象不可变对象

    改变变量指的是改变那个"-->"的指向,而原本指向的内存空间保持不变。改变变量的值指的是改变那段内存空间存储的数据...

  • Python面试

    Python中万物皆对象,对象有可变(mutable)与不可变(immutable)对象 在python中,str...

  • Python的可变对象与不可变对象 !

    在初学Python时,经常需要区分“可变对象”和“不可变对象”。其中,可变对象包括列表(list)、字典(dict...

  • python基础知识

    1. 可变对象和不可变对象 在python中,strings, tuples和numbers是不可更改的对象,而 ...

网友评论

      本文标题:啥是 python 可变对象 不可变对象?

      本文链接:https://www.haomeiwen.com/subject/junwgqtx.html