Python 的 list 中的元素是像 C 的数组那样在内存里顺序存放的吗?

2019-04-29 15:02:07 +08:00
 phoolean
3187 次点击
所在节点    Python
9 条回复
BBCCBB
2019-04-29 15:14:16 +08:00
它支持随机访问,很明显是。
Sasasu
2019-04-29 15:20:10 +08:00
不,list 保存的是指针。
vencent
2019-04-29 15:23:30 +08:00
首先,保存的是对象的引用,不是对象。
其次,list 是动态数组。
sujin190
2019-04-29 15:41:14 +08:00
底层数据结构是的,只不过数组保存的是 object 指针,所以相比 c,即使保存数字这样的基础数据结构,仍然需要一次额外内存访问

可以动态增长是每次分配数组内存都是 2 的倍数,有额外空间,空间不足 resize 会申请一个新内存,然后 copy 过去,不过保存指针在数组值是大对象 resize 时性能又影响不那么大了
chitanda
2019-04-29 15:57:43 +08:00
panda 才是这样的吧
xpresslink
2019-04-29 18:51:59 +08:00
i0error
2019-04-30 01:14:15 +08:00
可以随时 append,我猜不是。。。
ccdrea
2019-04-30 11:26:36 +08:00
>>> a = 1
>>> id(a)
1598830848
>>> b = [a]
>>> id(b)
9390640
>>> id(b[0])
1598830848
>>>
看懂了吗
zpoint
2019-04-30 18:11:09 +08:00
是一个 c 数组, 但是数组里面的每个元素都是指向 PyObject 的指针, 达到一定阈值会触发 增大 /缩小 的操作, 实现上和 c++ 的 std::vector 类似

参考: https://github.com/zpoint/Cpython-Internals/blob/master/BasicObject/list/list.md

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/559758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX