小议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

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

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenjx85的技术专栏

leetcode-844-比较含退格的字符串(用vector取代stack)

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

671
来自专栏Flutter入门到实战

老司机用一篇博客带你快速熟悉Dart语法

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/3d927a7bf020

3612
来自专栏IT探索

c/c++程序员快速入门python

print arr.remove('a') #按值删除元素,并返回该元素的值。注意:只删除第一次匹配的元素

1014
来自专栏北京马哥教育

Python3急速入门 (一) 基础语法

豌豆贴心提醒,这是马哥Linux运维Python3急速入门系列第1篇文章 1.编码问题 默认情况下,Python 3源码文件以 UTF-8 编码,所有字符串都...

3218
来自专栏程序员互动联盟

【答疑释惑第三十五讲】c语言数组指针问题

疑惑一 数组名a与a[0] ? 这个问题其实是非常基础的,a代表的是一个数组,而a[0]只是数组的一个元素。数组a是一个常量,在某些时候可以转化为指针的功能(但...

2996
来自专栏Pythonista

Go语言基础

Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:

953
来自专栏Core Net

H5 data-*容易忽略的问题

3486
来自专栏JetpropelledSnake

Python入门之面向对象编程(三)Python类的魔术方法

python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法。这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功...

2974
来自专栏Golang语言社区

Go基础系列:struct和嵌套struct

struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一。

1102
来自专栏JAVA技术站

shell学习一变量的定义 原

用符号$加上变量名如 $name 或${name},{}括号是为了确定变理边界,推荐使用

651

扫码关注云+社区