"的指向,而原本指向的内存空间保持不变。改变变量的值指的是改变那段内存空间存储的数据...">
美文网首页
python 可变对象不可变对象

python 可变对象不可变对象

作者: hehehehe | 来源:发表于2022-07-13 15:56 被阅读0次

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

    引用的不变性是指变量一旦被确定指向某个内存空间中的对象,就不能再改变自己的指向。而至于对象的数值是否发生变化,则不在引用不变性的讨论范围中。
    为了声明引用的不变性,需要使用final字段修饰那个变量:

    不变对象是指该对象一旦被创建,就无法改变。如果原先指向这个对象的变量希望改变数值,它需要指向另一个不同的对象。例如,String就是一种不变对象。

    不可变类型:Number,String,Tuple。

    不可变是指我们不可以改变数据在内存中的地址,当我们改变变量值的时候重新引用到新数据的地址

    In [115]: id(100)
    Out[115]: 4409212624
    
    In [116]: a = 100
    
    In [117]: id(a)
    Out[117]: 4409212624
    
    In [118]: a = 101
    
    In [119]: id(a)
    Out[119]: 4409212656
    
    In [120]: id(101)
    Out[120]: 4409212656
    
    In [121]: id(100)
    Out[121]: 4409212624
    
    可以变:Set(集合)、List(列表)、Dictionary(字典)

    可变类型(列表和字典)的数据变化,是通过方法(比如append,remove,pop等)来实现的,不会改变地址。而重新赋值后地址会改变。具体运行结果如下图所示:

    参数传递

    和其他语言不同的是,Python中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递
    需要注意的是,这里的赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象
    如果对象是可变的,当其改变时,所有指向这个对象的变量都会改变
    如果对象不可变,简单的赋值只能改变其中一个变量的值,其余变量则不受影响

    java

    https://zhuanlan.zhihu.com/p/386319440

    1. 基本数据类型和对象数据类型的关系
      有无ID: 基本数据类型只有值没有ID,无法与其他值区分。对象数据类型既有值,也有ID。
      可变性:基本数据类型都不可变。对象数据类型有一部分可变、一部分不可变。
      存储位置:基本数据类型在栈上存储。对象数据类型在堆上存储。
      性能代价:基本数据类型消耗的资源少。对象数据类型消耗的资源大。
    参数传递

    所以Java中的传递只有值传递而没有引用传递,只不过传递为基本数据类型的话,是复制的数值,而对象类型的话,则是复制的对象存放地址。

    相关文章

      网友评论

          本文标题:python 可变对象不可变对象

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