美文网首页
啥是 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 可变对象 不可变对象?

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