7.19分享——不可变元组嵌套可变类型
大家都知道,元组是不可变数据类型,那么元组中嵌套可变数据类型会发生什么呢?
我们先来看,对于元组的操作,如果我们直接对元组内的元素进行修改,肯定是不行的。
lst = [5,6,7] dic = {'k':'v'} tu = (10,20,'alex',lst,dic,'wusir') tu[3] = [1,2,3] Traceback (most recent call last): File "xxx.py", line 4, in <module> tu[3] = [1,2,3] TypeError: 'tuple' object does not support item assignment
但是如果我们要修改元组中的列表呢?
lst = [5,6,7] dic = {'k':'v'} tu = (10,20,'alex',lst,dic,'wusir') tu[3].append(10) print(tu) tu[4]['kk'] = 'vvv' print(tu) 结果: (10, 20, 'alex', [5, 6, 7, 10], {'k': 'v'}, 'wusir') (10, 20, 'alex', [5, 6, 7, 10], {'k': 'v', 'kk': 'vvv'}, 'wusir')
很显然,我们修改成功了,也就是说元组中如果存储了可变数据类型,对可变数据类型内部的修改是允许的。
这种情况是如何形成的呢?
首先我们来看看元组中所有数据在内存中的存储

在我们看起来很简单的元组,实际在内存中的存储就是这样的,其实元组中存储的每一个元素都是对应的值所在的内存地址。
如果存储的内容是数字或者字符串,那么到对应的地址就可以直接找到值;
如果对应的内容是字典或者列表,那么也只能找到列表和字典的地址,然后字典和列表中的元素又存储在各自的地址中。
在这里我们要说名的是一旦元组被创建出来,那么元组中存储的数据的内存地址就不可能发生变更了。也就是下面这部分。

既然这部分地址不能变更,那么存储在这些地址中的内容自然也不能变更。

因此像10,20,'alex','wusir'这样的内容是肯定不可能变更的了。至于列表和字典,只要他们本身的内存地址不发生变化,改变其中的元素肯定是可以的啦。

就是这样,你看懂了么?所以说,在python中有很多细节的东西都是依赖对内存的了解的,大家要多多站在内存的角度上思考,形成习惯就能理解python中的很多现象了。

浙公网安备 33010602011771号