首页 > 编程语言 >小议Python列表和元组中的元素地址连续性

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

时间:2023-06-09 21:06:20浏览次数:51  
标签:小议 存储 Python 元素 列表 item 元组


众所周知,在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,元素,列表,item,元组
From: https://blog.51cto.com/u_9653244/6451066

相关文章

  • Python实现倒计时按钮
    很多网站会在注册或交易后给出一个许可协议或提醒信息,一般页面上会有个按钮,但是这个按钮是倒计时的,在倒计时结束之前是禁用的。本文使用tkinter模拟了这样的倒计时按钮。importtkinterimporttimeimportthreading#创建应用程序窗口,设置标题和大小root=tkinter.Tk()root.tit......
  • Python组合列表中多个整数得到最小整数(一个算法的巧妙实现)
    '''程序功能:  给定一个含有多个整数的列表,将这些整数任意组合和连接,  返回能得到的最小值。  代码思路:  将这些整数变为相同长度(按最大的进行统一),短的右侧使用个位数补齐  然后将这些新的数字升序排列,将低位补齐的数字删掉,  把剩下的数字连接起来,即可得到满足要......
  • Python中提供的各种队列结构
    Python标准库queue提供了LILO队列类Queue、LIFO队列类LifoQueue、优先级队列类PriorityQueue,标准库collections提供了双端队列。例如:>>>fromqueueimportQueue#LILO队列>>>q=Queue()#创建队列对象>>>q.put(0)#在队列尾部插入元素>>>q.put(1)>>>q.put(2)>&......
  • Python编写编程作业批量自动打分程序的思路与实现
    总体思路:把接口明确地告诉学生(本文后面的代码要求学生程序中必须有个函数叫做searchOnede),然后学生把Python程序文件(学号_姓名.py)以任何方式提交给老师,放到同一文件夹中。下面的代码首先由老师编写一个自己认为的最佳和最优实现,然后把学生的程序文件作为模块导入并调用其中的searchO......
  • 详解Python中的位运算符规则、原理与用法
    在Python中,位运算符包括位与(&)、位或(|)、位求反(~)、位异或(^)、左移位(<<)和右移位(>>)。1.运算方法与规则位运算符只能适用于整数,其总体运算规则为:首先把整数转换为二进制表示形式,按最低位对齐,短的高位补0,然后进行位运算,最后把得到的二进制转换为十进制数。位与运算符运算规则:0&0=0&1=1&0=......
  • Python批量Excel文件数据导入SQLite数据库的优化方案
    说明:1)需要安装扩展库openpyxl;2)随着数据库的增大,导入速度可能会有所下降;3)本文只考虑Python代码优化,没有涉及数据库的优化;4)本文要点在于使用executemany实现批量数据导入,通过减少事务提交次数提高导入速度。fromrandomimportchoice,randrangefromstringimportdigits,ascii......
  • Python求解进制问题(阿里巴巴2015笔试题)
    问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来不及。也就是说,应该是有更简单的方法。以我们最熟悉的十进制为例,一个数乘以10相当于......
  • Python中直接查看对象值和使用print()输出的区别
    直接用代码来描述这个问题的现象:>>>x=r'C:\windows\notepad.exe'>>>x'C:\\windows\\notepad.exe'>>>print(x)C:\windows\notepad.exe>>>x='''Tomsaid,"Let'sgo."'......
  • Python提取彩色图像的二值化边缘
    所谓二值化是指只包含白和黑这两种颜色,下面的代码中使用白色表示内部或背景,使用黑色表示边缘。图像边缘提取的基本思路是:如果一个像素的颜色值与周围像素足够接近(属于低频部分)则认为是图像背景或者内部,如果一个像素的颜色值与周围像素相差很大(属于高频部分)则认为是图像边缘。在具体......
  • Python+SQLite开发无界面版通信录管理系统
    本文重点在于演示Python对SQLite数据库的操作,以及命令行式菜单的工作原理和实现。首先使用SQLiteDatabaseBrowser创建SQLite数据库data.db,然后创建一个数据表addressList,最后在数据表addressList中创建字段id(INTEGERPRIMARYKEY类型)、name(TEXT类型)、sex(TEXT类型)、age(NUMERIC类型......