python 中一切皆对象,每个变量都包含一个对象实例
a = [1,2,3] a 变量 [1,2,3] 对象实例
每当我们初始化一个对象时,内存会为其分配一个内存地址
当我们在python环境中输入了并执行了[1,2,3],这就是在内存中创建一个对象,但是我目前无法使用它,我们必须给将其赋值给一个变量。
(我们将我们创建的对象[1,2,3])赋值给了变量 a,我们可以通过使用a 来达到调用对象[1,2,3]的目的。
# 查看内存为对象[1,2,3] 分配内存位置我们可以通过id() 函数用于获取对象的内存地址 print(id(a))
变量是对内存中对象的引用,变量指向对象的内存地址
我们通过将a 赋值给了b 也可以说是,b 调用了a变量,但是所谓b 调用了a变量,其实是指b调用了实例对象 2 ,我们可以通过检查它们之间在内存存放的位置来得以证实
我们在python中说的可变对象和不可变对象,是指对象本身的内容是否可以发生变化。
在python 中可变对象不可变对象的数据类型分别有哪些?
- 可变对象:list dict set
- 不可变对象:tuple string int float bool
我们以 不可变对象 int 为案例。
不可变指的是,我们首先 将 a 指向了内存中 对象 1,内存为其分配了位置( id ),我们说不可变,其实是在id空间存储的对象不可变,也就是存储在 ‘1929992012016’ 位置中的数据不可修改。
下面我们来看:
a = 1
id(a)
a = 2
id (a)
如果说整数可以修改的话,当我们执行a = 2时,id(a) 返回位置信息应该和a = 1 , id(a) 返回的位置信息要一致但是显然没有
如果是可变对象 list
我们即便是对list对象中的数据进行了修改,但是 b 和 a 返回同样的id位置,也就是 变量b和变量a 指向内存中同一个位置。
大家可以这样理解:
有一个盒子,放置了 对象 [1,2,3], 它的标识符是 1930086882240,我们现在要将它第二数据3拿出来,放置新的数据 4 ,盒子还是原来的盒子,但是里面的数据或者内容发生了变化这既是可变对象。
如果 int 不能明确理解,我们还可以通过使用其他不可变数据类型 tuple (元组)
如何理解这个问题请看:
图片信息引用地址:http://t.csdnimg.cn/n21T9
我们回到我们说的
a = 1
id (a)
a = 2
id(a)
它们返回的id (是该对象的内存地址。) 是不一样的,按不可变对象的定义理解,他们不是发生了变化吗? 明显它们返回的id 不一样,对返回id是不一样,我们所说的可变是指同一个id 下,里面的内容可变, 而不是id 可变, id 可变说明了存储为其开辟了新的内存空间它就不是原来那个盒子了,而是一个新的盒子。
感谢各位csdn 知乎上各位it 作者对于 ”可变对象对象与不可变对象“这一概念的准确阐述,本篇文章的编写离不开各位同僚的支持,我谨代表自己向大家表示感谢
文章部分内容转载:
python可变对象与不可变对象 - Dwzb的文章 - 知乎 https://zhuanlan.zhihu.com/p/34395671
作者: Dwzb
Python对象系列1:可变对象和不可变对象 - 须臾之间的文章 - 知乎 https://zhuanlan.zhihu.com/p/337450935
作者: 须臾之间
python可变对象与不可变对象 | 酷python (coolpython.net)
作者: 酷python
我们对a 的调用其实是对 对象 [1,2,3] 的调用
a = 1
c = a + 1