python 可变对象不可变对象

2022-07-13  本文已影响0人  hehehehe

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

引用的不变性是指变量一旦被确定指向某个内存空间中的对象,就不能再改变自己的指向。而至于对象的数值是否发生变化,则不在引用不变性的讨论范围中。
为了声明引用的不变性,需要使用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中的传递只有值传递而没有引用传递,只不过传递为基本数据类型的话,是复制的数值,而对象类型的话,则是复制的对象存放地址。

上一篇下一篇

猜你喜欢

热点阅读