前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小议Python列表和元组中的元素地址连续性

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

作者头像
Python小屋屋主
发布2018-04-17 10:40:02
4.8K0
发布2018-04-17 10:40:02
举报
文章被收录于专栏:Python小屋

众所周知,在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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档