为什么Python中列表元素查找的复杂度是O(1)?

2024-03-24

今天在课堂上,我们了解到从列表中检索元素是O(1)在Python中。为什么会这样呢?假设我有一个包含四个项目的列表,例如:

li = ["perry", 1, 23.5, "s"]

这些项目在内存中具有不同的大小。所以不可能获取内存位置li[0]并添加每个元素大小的三倍以获得内存位置li[3]。那么解释器如何知道在哪里li[3]是不需要遍历列表来检索元素?


A list in Python is implemented as an array of pointers1. So, what's really happening when you create the list:

["perry", 1, 23.5, "s"]

是你实际上正在创建一个指针数组,如下所示:

[0xa3d25342, 0x635423fa, 0xff243546, 0x2545fade]

每个指针“指向”内存中各自的对象,因此字符串"perry"将被存储在地址0xa3d25342和号码1将被存储在0x635423fa, etc.

由于所有指针的大小相同,因此解释器can实际上将元素大小的 3 倍添加到li[0]获取存储在的指针li[3].


1 Get more details from: the horse's mouth (CPython source code on GitHub) https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Include/listobject.h#L22.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Python中列表元素查找的复杂度是O(1)? 的相关文章

随机推荐

  • 任务“:app:kaptDebugKotlin”执行失败。当干净构建时

    我在使用 cmd 构建项目时遇到问题 当我使用 android studio 构建项目时没问题 但是当我清理项目然后使用 cmd 构建时出现错误 这个命令 gradlew assemble调试 这个错误 失败 构建失败并出现异常 什么地方出
  • 将 scala 2.10 future 转换为 scalaz.concurrent.Future // 任务

    有人找到了如何将 scala 的 Future 2 10 正确转换为新的 scalaz7 future 的代码吗 我知道很想通过 scala Promise 将 scalaz future 转换为 scala Future 但不知道如何正确
  • 获取当前正在运行的应用程序

    如何获取当前正在运行的应用程序 我想检查应用程序是否正在运行或不在服务中 我为此使用了以下代码 ActivityManager activityManager ActivityManager this getSystemService AC
  • Swift - Firebase 函数signInWithEmail 在第一次调用时不执行

    IBAction func loginEmailButton sender AnyObject FIRAuth auth signInWithEmail email text password password text completio
  • WPF 中透明背景变黑

    我尝试创建一个带有圆角的窗口 我将窗口背景设置为透明并将边框背景设置为白色 然而 在边框和窗口之间的区域 我得到黑色背景而不是透明背景 我在 Windows 7 上使用 C WPF VS2010 进行开发 下面是我的 XAML 和屏幕截图
  • 将具有循环结构的 JS 对象存储在本地存储中,并在重新加载时获取循环结构

    我想存储 本地存储 HTML5 JS 对象 为此 我必须申请JSON stringify obj 到我想要存储的JS对象 之后我就可以存储该对象localStorage obj JSON stringify obj 但有些 JS 对象非常大
  • 请教 php 总结 01 + 01 = 02

    我想在数据库中创建一个id id user gt 数据类型 varchar 我希望我的 id 从00 01 02 等等 为了创建新的 id 我对所有行进行计数 并且计数的结果将添加 01 Example id array 00 01 02
  • 处理块、完成处理程序、dispatch_async 与dispatch_sync

    我正在线程中执行在线数据获取 并且我想在执行块后立即执行某些操作 这是我的代码 IBAction refresh UIBarButtonItem sender NSLog checking self editToolbar dispatch
  • HM10 ble改变特征值AT命令Arduino

    谁能帮我用AT命令写入特征值 或者如何使用Hm10模块将数据从arduino发送到另一个ble设备 HM10发送AT START后 会通告数据包 并且可以检测服务和特征 但特征值是默认的0x00 如何更改 多次检查数据表 但找不到能够执行相
  • 托管 C++/CLI 类中的 auto_ptr 或 shared_ptr 等效项

    在 C CLI 中 您可以在托管类中使用本机类型 因为不允许在托管类中保存本机类的成员 在这种情况下您需要使用指针 这是一个例子 class NativeClass public ref class ManagedClass private
  • Discord.js v14 创建频道

    我尝试创建一个频道 但总是出现错误 我不知道如何解决它 不要注意 req 0 在 代码 中 它来自数据库 与问题没有链接 因为它在 v13 中工作 看来您的帖子主要是代码 请添加更多详细信息 我不知道我能得到什么更多的细节 哈哈 抱歉 英语
  • 在 Node.js 中的单个 HTTP 请求中调用多个 HTTP 请求

    我试图在单个 URL 调用中调用多个 URL 并将其 json 响应推送到数组中 然后将该数组发送给最终用户 我的代码如下所示 var express require express var main router express Rout
  • 我有一个 JApplet,它必须显示 3 个组件。 (2 个 JPanel 和 1 个 Paint 方法)

    我有一个作业 其中我必须允许用户使用二次方程绘制图表 我设法绘制了图形的骨架 现在我尝试显示 控制面板 以供用户输入值 我有4个文件 graph java panel java panelB java panelC java 我的问题是当我
  • 如何在 debian 上安装 apcu 作为 php7 扩展

    我看过这个ubuntu教程 http thereluctantdeveloper com 2015 12 quick and dirty php 70 set up on ubuntu 1404 with apcu http therelu
  • SQL Server 执行模拟

    两者有什么区别 execute as user testuser AND execute as login testuser 我正在这些登录名下执行跨数据库过程 它适用于作为登录名执行 但不适用于作为用户执行 这表示服务器主体 testus
  • 编译为 C 时的垃圾收集

    将垃圾收集语言编译为C时 垃圾收集的技术有哪些 我知道有两个 维护一个影子堆栈 将所有根显式保存在数据结构中 使用像 Boehm 这样的保守垃圾收集器 第一种技术很慢 因为您必须维护影子堆栈 可能每次调用函数时 您都需要将局部变量保存在数据
  • 如何使用 jQuery 获取 id 元素的一部分?

    如何从 id old id 的 span 中获取 一些文本 并将其放入 id new id 中 span Some text span span span span Some text span span span 我不知道如何获得数字部分
  • 4 层(对于 N 层)架构示例?

    最近 我的一个朋友向我询问 N 层架构 我能够通过示例向他解释 1 2 和 3 层架构 但当我想给出超过 3 层的例子时 我就陷入了困境 我用谷歌搜索并大量寻求帮助 但找不到任何像样的例子 事实上 它被命名为 N 层 这让我认为 N 可以是
  • 使用升压间隔_map

    试图遵循boost party我制作了这个示例代码 include boost icl interval hpp include boost icl interval map hpp include
  • 为什么Python中列表元素查找的复杂度是O(1)?

    今天在课堂上 我们了解到从列表中检索元素是O 1 在Python中 为什么会这样呢 假设我有一个包含四个项目的列表 例如 li perry 1 23 5 s 这些项目在内存中具有不同的大小 所以不可能获取内存位置li 0 并添加每个元素大小