python精讲 不可变对象与可变对象

对象(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[0]=4

重新赋值则开辟新的内存块存储新的值,顶替原来的对象和值
在这里插入图片描述

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

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值