首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python如何实现字符串的索引?

python如何实现字符串的索引?
EN

Stack Overflow用户
提问于 2020-07-23 08:16:34
回答 2查看 160关注 0票数 0

Goodrich编写的数据结构和算法说,python数组是将一组相关变量一个接一个地存储在计算机内存的连续区域中,因此可以通过计算address.For示例直接访问索引,如果数组的第一个元素的内存地址是2146,并且每个元素占用两个字节的内存,那么第六个元素的内存地址是2146+2*5=2156,因此计算机可以直接访问地址2156来获取第六个元素。

但我试着去验证,结果发现结果与理论不符。

代码语言:javascript
运行
复制
str1 = "example"
for i in range(1,6):
    print(id(str1[i])-id(str1[i-1]))

输出如下

代码语言:javascript
运行
复制
-336384
471680
-492352
313664
178944

为什么会发生这种情况,如果内存地址不连续,python如何通过索引获得其内存地址,然后访问元素?

EN

回答 2

Stack Overflow用户

发布于 2020-07-23 10:11:24

我所知道的与"Python数组“最接近的是一个numpy.array,实际上:

代码语言:javascript
运行
复制
In [1]: import numpy as np                                                                                                                                                                       

In [2]: a = np.array([12, 4, 120, 24, 3, 0, 13, 13], dtype='int8')                                                                                                                               

In [3]: asint64 = a.view('int64')[0]                                                                                                                                                             

In [4]: for i in range(8): 
   ...:     print(asint64 % 2**(8*(i+1)) // 2**(8*(i))) 
   ...:                                                                                                                                                                                          
12
4
120
24
3
0
13
13

这里发生的事情是,您首先使用每个8位构建一个由8个数字组成的数组;当您稍后要求numpy将它们看作单个64位数时,您会得到它是由8位数字的8位表示组成的,这些8位数是并置的。因此,原来的8个整数在记忆中是绝对不变的。

一般来说,问Python“告诉我在这个任意的内存位置是什么”,或者“告诉我这个字符串或数组的项目在内存中的确切位置”是.稍微不那么斜。

编辑: ..。这有点不那么简单,但至少减轻了任何怀疑a.view正在做奇怪事情的嫌疑,因此,我们在这里查看数组的子数组的确切位置:

代码语言:javascript
运行
复制
In [5]: for i in range(8): 
   ...:     print(a[i:].__array_interface__['data'][0]) 
   ...:                                                                                                                                                                                          
45993728
45993729
45993730
45993731
45993732
45993733
45993734
45993735

(只要您信任.__array_interface__['data'][0],不要做奇怪的事情!)

票数 1
EN

Stack Overflow用户

发布于 2020-07-23 09:55:58

据我所知,Python (或至少CPython)将列表实现为动态数组。

如果您不熟悉动态数组的概念,可能值得查看一下这篇文章

但是,在Python中实现这些动态数组的方式与数据结构的“标准实现”不同--请参阅下面引用的动态数组上的Wikipedia页面

..。在诸如Python或Java这样的语言中,执行引用语义的动态数组通常不会存储实际数据,而是存储对驻留在其他内存区域的数据的引用。在这种情况下,按顺序访问数组中的项实际上将涉及访问多个非连续的内存区域,因此这种数据结构的高速缓存友好性的许多优点将不复存在。- 维基百科

乍一看,我无法找到任何关于这方面的支持文章或文档,然而,我认为字符串的实现方式与Python中列表的实现方式类似--虽然有一些重要的修改,但部分的基本逻辑是相似的。

以这种方式实现的字符串可以很好地解释为什么要看到子字符串(Python没有显式char类,char变量只是长度为1的字符串,就Python而言)在运行时内存中的非连续位置的字符串中。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63049825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档