您当前的位置:首页 > 计算机 > 编程开发 > Python

小议Python列表和元组中的元素地址连续性

时间:12-24来源:作者:点击数:

众所周知,在Python中字典和集合依赖元素哈希表来存储,并不存在传统意义上的所谓元素“顺序”,当然,如果需要一个有序的字典可以使用collections模块提供的OrderedDict类。

在Python中,列表和元组属于有序序列,支持下标随机访问,也支持切片操作。当然,列表是可变序列而元组属于不可变序列,这一点决定了它们之间有很大不同。

今天的话题是列表和元组中的元素到底是不是连续存储的。了解C语言的朋友都知道,数组是连续存储的,所以可以下标来直接访问其中任意位置上的元素。而Head First Python戏称列表是“打了激素的列表”,又说元组是”轻量级的列表“,这样的说法仅仅是说列表比数组的功能强大很多吗?其实不是的,Python列表和C语言中数组在实现上也有很大区别,当然这是Python和C的内核与设计理念不同造成的。

在Python中,变量并不直接存储值,而是存储值的引用。也就是说,x=3这样一个语句执行的过程实际上是先把数字3放入内存合适位置,然后再让变量x引用这个地址(类似于指针)。这一点同样适用于任何类型的变量,也适用于列表或元组中的元素。也就是说,列表或元组中的元素实际上存储的是值的引用,而不是直接存储值。

因此,说列表或元组中元素是连续存储或不连续存储都是有道理的。列表中的元素是连续存储的,所以支持下标操作和切片,但这些元素引用的地址却在绝大多数情况下是不连续的。

>>> x = list(range(10))

>>> for item in x:

        print(item, ':', id(item))

0 : 1584768064

1 : 1584768096

2 : 1584768128

3 : 1584768160

4 : 1584768192

5 : 1584768224

6 : 1584768256

7 : 1584768288

8 : 1584768320

9 : 1584768352

>>> import random

>>> x = [random.randrange(10000) for i in range(10)]

>>> for item in x:

       print(item, ':', id(item))

2387 : 2036619874864

568 : 2036619874768

8162 : 2036619874960

1111 : 2036619874928

1171 : 2036619874992

2506 : 2036619874896

9331 : 2036619875056

5348 : 2036619875088

4738 : 2036619875120

3182 : 2036619875024

或者说,可以用下图来表示列表和元组中元素的连续性,其中箭头表示每个元素引用的地址。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门