Python关于不可变对象

Python关于不可变对象

(关于学习廖雪峰Python教程的一些个人总结)

首先什么是不可变对象,不可变对象首先是个对象,一旦创立了这个对象,这个对象就不能再改变了。

关于数字,字符串

Python中数字,字符串都是不可变对象,咦?你可能问怎么不可变,我令a=1,我还可以再令a=2,我令s='abc',我还可以再令s='ABC'

注意这个说法是错误的,因为你改变的是变量而不是数字对象或者字符串对象本身,根据Python的变量存储方式,a=1或者s='abc'是在内存中开辟一块空间创建了1或'abc'这个数字对象或者字符串对象,然后变量a或s不过是指向数据对象的地址,而再次令a=2或者s='ABC',Python不过是又在内存空间中创建了一个新的2或者’ABC’这个数字对象或字符串对象,然后让变量a或者s指向新的数据地址,而原来内存中的1和'abc'并没有改变。

再比如字符串的replace方法:

a = 'abc'
print(a.replace('a', 'A'))
print(a)

输出结果是:

'Abc'
'abc'

原因就是字符串对象是不可变对象,使用replace方法不过是又创建了一个新的字符串对象'Abc',原来的'abc'没变,而且a依然指向它。

关于元组tuple

元组一般是不可变的,一旦创建,就不能改变,比如:

t = (1, 2, 3)

这样,你赋值t[0] = 10是不行的。

但是下面这个情况,他却是“可变的”(???不是刚说了不可变嘛)

t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)

发现t改变了,变成了

('a', 'b', ['X', 'Y'])

我们先看看定义的时候tuple包含的3个元素:

tuple-0

当我们把list的元素'A''B'修改为'X''Y'后,tuple变为:

tuple-1

表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变

即0还是指向字符串a,1还是指向字符串b,2还是指向这个list列表。只不过list列表本身是可变的。

所以说(1, 2, 3)本质上是不可变对象,而(1, [2, 3])本质上是可变对象,下面我们会看到为什么。

关于字典和集合

字典相当于map,使用键值对存储,使用哈希计算,键不能重复,而集合也是一组键的集合,不能重复。

由于键不能重复的这条性质就要求,字典的键和集合中的元素必须是不可变对象,因为无法判断两个可变对象是否相等。

所以下面代码是可行的:

d = {(1, 2, 3): 'haha'}
s = s = set([(1, 2, 3)]) # set集合中加一个元组(1, 2, 3)

下面的代码会报错:

d = {(1, [2, 3]): 'haha'}
s = s = set([(1, [2, 3])]) # set集合中加一个元组(1, [2, 3])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值