当前位置: 首页 > 后端技术 > Python

Python不可变对象真的不可变吗?

时间:2023-03-25 22:00:35 Python

在日常的工作和学习中,经常会遇到“不可变对象”相关的问题,但是随着我接触Python语言的时间越来越长,遇到的坑也越来越奇怪。不禁有个疑问:不可变对象真的不可变吗?我们知道元组是“不可变对象”。当你试图给元组赋值时,它会报错:my_tuple=("python","dict","is","good")my_tuple[3]="excellent"Traceback(mostrecentcalllast):文件“”,line1,inTypeError:'tuple'objectdoesnotsupportitemassignment请注意错误的语言:“不支持item**赋值**”,tuple对象不支持不支持赋值操作。##Example1让我们看看这样的操作:int_tuple=([6,5,30],[2,3,65],[111])int_tuple[2]+=[22,33]Traceback(最近的calllast):File"",line1,inTypeError:'tuple'objectdoesnotsupportitemassignmentint_tuple([6,5,30],[2,3,65],[111,22],33])虽然报错了,但是它的变量的值已经改了。###原因其实是,这里的主要原因是+=操作会为“不可变对象”生成新的变量,并绑定到原来的变量上。但是因为+=中的“=”号,对元组对象进行了赋值操作,这是不允许的,所以报错,但是新对象已经绑定到原变量上了,所以我们可以看到变量的值已更改。##例2还有一种情况是这样的:int_tuple=([6,5,30],[2,3,65],[111])int_tuple[2].append(123123)int_tuple([6,5,30],[2,3,65],[111,123123])这里完全没有报错,为什么呢?因为append不涉及赋值操作,tuples就是不允许赋值,不允许append和extend,所以把tuples称为“不可变对象”太不准确了!##深一点其实如果知道元组中存储的是元素对应的地址(ID),就更容易理解了。append和extend只是修改列表的元素,但列表本身的ID并没有改变。只有在进行赋值操作时,ID才会发生变化,这是元组不允许的。append不会改变地址int_tuple=([1],[2],[3])id(int_tuple[1])2729947990600int_tuple[1].append(22)id(int_tuple[1])2729947990600所以要避免步进onGetonthesepitflasts,忘掉元组是“不可变对象”的不精确表达(当然,从地址的角度来说是正确的,元组内部所有元素的ID都是不可变的),请这样写:**元组是不可分配的对象**。这是我们文章的结尾。如果你今天想要我们的【Python教程】(https://pythondict.com),请继续关注我们。如果对你有帮助,请在下方点赞/观看![](https://pythondict.com/wp-content/uploads/2019/08/2019081212245760.gif)如有任何问题,可以留言在下方留言区留言,我们会耐心为您解答!***Python实战宝典[(pythondict.com](http://pythondict.com))不只是一个合集,欢迎关注公众号:Python实战宝典变了?](https://pythondict.com/python-solution/is-python-immutable-objects-real/)![Python实战宝典](https://pythondict.com/wp-content/uploads/2019/08/2019080218203145.jpg)