Python 可变对象与不可变对象

一直对这个问题很好奇,感觉这个涉及数据存储的方式和规划,听起来就很有意思。所有面向对象的语言应当都有可变对象和不可变对象。

概念

Python中一切皆对象,每个对象都有自己的id,type和value。
id:一个对象被创建后,需要在内存中存储,这个地址就是 id 值。
type:和 id 一样,当对象被创建后,type 值也不可以再改变,type 决定了该对象所能够支持的操作。
value: 对象的值。

一个对象可变与否就在于其 value 值是否支持改变,也就是改变后对 id 值有无影响。
可变对象值变化后对内存地址是无影响的。

作为函数参数

可变对象作为参数传入时,在函数中对其本身进行修改,是会影响到全局中的这个变量值的,因为函数直接对该地址的值进行了修改。
对不可变对象来说,虽然函数中的a值变了,但是全局中的a值没变,因为函数中的a值已经对应了另外一个地址,而全局中的a值指向的原来地址的值是没有变的。

python中向函数传递参数只能是引用传递,表示把它的地址都传进去了,这才会带来上面的现象。

有的编程语言允许值传递,即只是把值传进去,在里面另外找一个地址来放,这样就不会影响全局中的变量。

可变参数在类中使用

类中的变量和全局变量地址依然是共用的,无论在哪里修改都会影响对方,所以要想只修改局部的,一定要重新分配内存。

参考链接

  1. python可变对象与不可变对象 - Dwzb的文章 - 知乎 https://zhuanlan.zhihu.com/p/34395671
  2. https://blog.csdn.net/mango_12345/article/details/120443979
posted @ 2023-03-13 10:33  芋圆院长  阅读(43)  评论(0编辑  收藏  举报