文章目录
可变对象与不可变对象
关于什么是对象不是这篇的重点,可查看这篇
可变对象就是说对象的值是可以改变的,序列中可变对象有list 不可变对象有str、tuple
那么问题又来了,什么是序列?
- 序列是Python中最基本的一种数据结构
- 数据结构其实就是数据在计算机中的存储方式
- 序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引);并且序列中的数据会按照添加的顺序来分配索引
关于对象
对象在内存中的存储保存了三个数据
- id(标识)即内存地址,相当于C语言的指针
- type(类型)即数据类型,int、str、bool、float等…
- value(值) 即对象存储的内容,就是值
整形对象123,字符对象hello在内存中的数据结构如下图
而将对象赋值给变量就相当于将对象的值设定为对象的id,即内存地址,也就是指针
图解可变对象
list类型就是可变对象,即可以随意修改其索引对应的值,即对象的id、type是没有发生变化,改变的只是对象的值
a = [1,2,3]
print('修改前的a =',a,id(a))
a[0] = 2
print('第一次修改后的a =',a,id(a))
a = [4,5,6]
print('第二次修改后的a =',a,id(a))
执行结果
修改前的a = [1, 2, 3] 2326392234632
第一次修改后的a = [2, 2, 3] 2326392234632
第二次修改后的a = [4, 5, 6] 2326392740424
如果在指定一个变量指向这个0x111,那么这个修改这个变量的值会发生什么变化呢?
a = [1,2,3]
print('a =',a,id(a))
b = a
print('b =',b,id(b))
#修改变量b的值
b[0] = 2
print('修改后的b =',b,id(b))
执行结果
a = [1, 2, 3] 1979100914312
b = [1, 2, 3] 1979100914312
修改后的b = [2, 2, 3] 1979100914312
可见,会同时修改之前变量a的指向,这是因为a与b指向的是同一块内存空间
总结:
-
a[0] = 2 (改对象)
- 这个操作是在通过变量去修改对象的值
- 这种操作不会改变变量所指向的对象 (如上图所示)
- 当去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现
-
a = [4,5,6] (改变量)
- 这个操作是在给变量重新赋值
- 这种操作会改变变量所指向的对象
- 为一个变量重新赋值时,不会影响其他的变量
一般只有在为变量赋值时才是修改变量,其余的都是修改对象