zoukankan      html  css  js  c++  java
  • 可变对象 vs 不可变对象(Python)

    Python 在 heap 中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如 list。而不可变的对象则相反,表示其内容不可变。

    • 不可变对象:int,string,float,tuple
    • 可变对象 :list,dictionary

    1. 不可变对象

    由于 Python 中的变量存放的是对象引用(reference),所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的(相当于 C 语言中指向常量的指针,指针可以指向新的内存空间,但之前指向的常量不可改变)。运用这样的机制,有时候会让人产生糊涂,似乎可变对象变化了。如下面的代码:


    这里写图片描述

    由上可知, 不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用,指向新的不可变对象。作如下验证:

    >> a = 1
    >> id(a)
    30310136L
    
    >> b = 1
    >> id(b)
    30310136L
                        # 也即因为 a,b 都指向的是不可变对象,python 解释器就不再开辟新的内存空间,a、b 共同指向同一个不可变对象;
    
    >> a += 1
    >> id(a)
    30310112L
                        # a 指向了另外的内容
    
    >> id(b)
    30310136L

    2. 可变对象

    其对象的内容是可以变化的。当对象的内容发生变化时,变量的对象引用是不会变化的(直接上原始内存空间处进行修改)。如下面的例子。


    这里写图片描述

    >> m = [5, 9]
    >> id(m)
    155821128L
    
    >> m += [6]
    >> id(m)
    155821128L

    Python基础:Python可变对象和不可变对象

  • 相关阅读:
    54-Spiral Matrix
    查找、排序算法
    Java中Timer的使用
    2017/5/8总结 js数组及json(对象数组)操作
    asp.net 中文件上传的两种方式
    2017/4/24combox 使用
    2017/4/24 静态页,评论,购物车总结
    2017/4/23星期日 总结
    2017.4.16关于在线图书商城注册界面总结
    c#中的委托和事件
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9424076.html
Copyright © 2011-2022 走看看