小议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 条评论
登录 后参与评论

相关文章

来自专栏IT探索

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

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

1124
来自专栏Python研发

数据基本类型操作

992
来自专栏老司机的技术博客

golang学习笔记4:基本类型和运算符

布尔型的值只可以是常量 true 或者 false。一个简单的例子: var b bool = true 。两个类型相同的值可以使用相等 == 或者不等 != ...

2973
来自专栏Core Net

H5 data-*容易忽略的问题

3606
来自专栏积累沉淀

JavaScript正则表达式

什么是正则表达式? 正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本。 在JavaScript脚本中,利...

2795
来自专栏221-B

python正则表达式的部分特殊符号

\w - 匹配字母或数字或下划线或汉字(3.x版本可以匹配汉字,但2.x版本不可以) \s - 匹配任意的空白符 \b - 在正则表达式中表示单词的开头或结尾,...

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

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

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

3046
来自专栏谈补锅

正则限制输入为数字,且最多输入2位小数 之 新写法

  原本小程序需要一个限制文本框输入为数字,且最多保留2位小数的效果,网上找到的例子感觉有点繁琐,就自己写了一个。

6092
来自专栏北京马哥教育

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

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

3268
来自专栏Golang语言社区

Go语言的复合数据类型

Go语言的复合数据类型是基础数据类型的组合,主要包括四个数组,切片(slice),map和结构体。 数组和结构体的大小是固定大小的,数组的元素类型是固定的,结...

2835

扫码关注云+社区

领取腾讯云代金券