程序媛

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中的很多现象了。

 

posted @ 2019-07-19 17:04  Eva_J  阅读(421)  评论(0)    收藏  举报