Python 元组基本使用及其底层实现

您所在的位置:网站首页 python列表底层 Python 元组基本使用及其底层实现

Python 元组基本使用及其底层实现

2023-12-05 06:29| 来源: 网络整理| 查看: 265

创建元组

1. 使用 ( ) 直接创建

num = (7, 14, 21, 28, 35) abc = ( "Python", 19, [1,2], ('c',2.0) )

在 Python 中,元组通常都是使用一对小括号将所有元素包围起来的,但小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组,请看下面的例子:

t_tuble = 'a','b' print(type(t_tuble)) 结果

需要注意的一点是,当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,,否则 Python 解释器会将它视为字符串。

t_tuble = 'a', print(type(t_tuble)) t_tuble = ('a') print(type(t_tuble)) 结果

2.使用tuple()函数创建元组

#字符串转元组 t_tuble = tuple('abc') print(type(t_tuble),t_tuble) #将区间转换成元组 t_tuble = range(1, 6) tt_tuble = tuple(t_tuble) print(tt_tuble) 结果 ('a', 'b', 'c') (1, 2, 3, 4, 5) 访问元组

和列表一样,我们可以使用索引(Index)访问元组中的某个元素(得到的是一个元素的值),也可以使用切片访问元组中的一组元素(得到的是一个新的子元组)。

t_tuble = tuple('abs',) # 使用索引 print(t_tuble[2]) #使用切片 print(t_tuble[:2]) 结果 s ('a', 'b') 修改元组

元组是不可变序列,元组中的元素不能被修改,所以我们只能创建一个新的元组去替代旧的元组。

t_tuble = tuple('abs',) print(t_tuble) t_tuble = tuple('abc',) print(t_tuble) #结果 ('a', 'b', 's') ('a', 'b', 'c') t_tuble1 = tuple('abs',) print(t_tuble1) t_tuble2 = tuple('abc',) #使用切片 print(t_tuble2) print(t_tuble1+t_tuble2) 结果 ('a', 'b', 's') ('a', 'b', 'c') ('a', 'b', 's', 'a', 'b', 'c') 删除元组

当创建的元组不再使用时,可以通过 del 关键字将其删除

t_tuble1 = tuple('abs',) print(t_tuble1) del t_tuble1 print(t_tuble1) 结果 ('a', 'b', 's') print(t_tuble1) NameError: name 't_tuble1' is not defined

Python 自带垃圾回收功能,会自动销毁不用的元组,所以一般不需要通过 del 来手动删除。

元组源码分析

如下所示为 Python 3.7 tuple 元组的具体结构:

typedef struct { PyObject_VAR_HEAD PyObject *ob_item[1]; /* ob_item contains space for 'ob_size' elements. * Items must normally not be NULL, except during construction when * the tuple is not yet visible outside the function that builds it. */ } PyTupleObject;

tuple本质也是一个数组,但是空间大小固定。不同于一般数组,python的tuple做了许多优化,来提升在程序中的效率

举个例子,为了提高效率避免频繁调用系统函数的free和malloc向操作系统申请和释放空间,tuple源文件中定义了一个free_list:

static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];

所有申请过的,大小一定的元组在释放的时候会被放进这个free_list中以供下次使用。也就是说,如果以后需要再去创建同样的tuple,python就可以直接从缓存中载入。

free_list[0] 用于存储长度为 0 的 tuple 对象,整个解释器的生命周期里面只有一个长度为 0 的 tuple 对象实例free_list[1] 用于存储长度为 1 的 tuple 对象,可以通过 tuple 对象的 ob_item[0] 指针遍历到下一个长度为 1 的 tuple 对象


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3