对象(object)
cpu,内存,硬盘之间的关系:
CPU与内存间的工作关系为:
当我们在计算机上执行一个程序时,首先由输入设备向CPU发出操作指令,
CPU接收到操作指令后,硬盘中对应的程序指令被直接加载到内存中,此
后,CPU再对内存进行寻址操作,将加载到内存中的指令翻译出来,而后
发送操作信号给操作控制器,实现程序的运行或数据的处理。
对象
- 对象即在内存中存储数据的一块区域
- Python 中的变量不是装有对象的“容器”,而是贴在对象上的“标签”。
真正的存贮位置是内存中
- 每个对象都有三个要素:id(标识)(唯一性,每个对象都有唯一的id)
type(类型)(决定对象的功能)
value(值)(对象存储的数据值)
- 在python中,可变对象包括:list、set、dict、自定义对象;
- 不可对对象包括:int、float、str、bool、tuple等。
- 不可变对象步允许自身内容进行修改。如果我们队一个不可变对象进行赋值,实际上是生成一个新对象,再让变量指向这个对象。哪怕这个对象简单到只是数字0和1
每个对象在内存中都会存储三个数据:
1.id(标识)
2.type(类型)
3.value(值)
可变对象与不可变对象
可变对象
而可变对象即指在对象不改变的前提下让对象的数据发生改变
即值发生改变但是 对象 未发生改变,例如 标识id 不会发生改变
a = [1,2,3]
print('修改前',a,id(a))
a[0] = 4 #改变了值
print('修改后',a,id(a)) #但是id未变
修改前 [1, 2, 3] 1221617771648
修改后 [4, 2, 3] 1221617771648
对象没有发生改变而值发生改变
重新赋值则开辟新的内存块存储新的值,顶替原来的对象和值
a = [1,2,3]
print('修改前',a,id(a))
a = [2,3,4] #重新赋值即重新建立一个a,所以这个a不是原来的a,
#而是新生的a
print('修改后',a,id(a)) #所以内存中重新开辟空间,对象发生改变
修改前 [1, 2, 3] 2057897038528
修改后 [2, 3, 4] 2057897038720
因为对象不可变,所以为了提高效率,Python 会使用一些公用的对象:
a = 1
print('a', id(a))
b = 1
print('b', id(b))
print(a == b)
print(a is b)
c = 'hello world'
print('c', id(c))
d = 'hello world'
print('d', id(d))
print(c == d)
print(c is d)
输出:
a 4423761776
b 4423761776
True
True
c 4430180912
d 4430180912
True
True
这里顺便提一下 is 这个操作符。它和 == 的区别在于:== 只判断“值”是不是相等,而 is 则判断是否为同一个对象,也就是地址一致。比如:
a = 2
b = 2.0
print(a == b)
print(a is b)
输出:
True
False
不可变对象
不可变对象不允许对自身内容进行修改。如果我们对一个不可变对象进行赋值,实际上是生成一个新对象,再让变量指向这个对象。:
即重新赋值
a = 0
print('a', id(a))
a = 1
print('a', id(a))
输出:
a 4463151440
a 4463151472