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

2019 年 4 月 29 日
 phoolean
3949 次点击
所在节点    Python
9 条回复
BBCCBB
2019 年 4 月 29 日
它支持随机访问,很明显是。
Sasasu
2019 年 4 月 29 日
不,list 保存的是指针。
vencent
2019 年 4 月 29 日
首先,保存的是对象的引用,不是对象。
其次,list 是动态数组。
sujin190
2019 年 4 月 29 日
底层数据结构是的,只不过数组保存的是 object 指针,所以相比 c,即使保存数字这样的基础数据结构,仍然需要一次额外内存访问

可以动态增长是每次分配数组内存都是 2 的倍数,有额外空间,空间不足 resize 会申请一个新内存,然后 copy 过去,不过保存指针在数组值是大对象 resize 时性能又影响不那么大了
chitanda
2019 年 4 月 29 日
panda 才是这样的吧
xpresslink
2019 年 4 月 29 日
i0error
2019 年 4 月 30 日
可以随时 append,我猜不是。。。
ccdrea
2019 年 4 月 30 日
>>> a = 1
>>> id(a)
1598830848
>>> b = [a]
>>> id(b)
9390640
>>> id(b[0])
1598830848
>>>
看懂了吗
zpoint
2019 年 4 月 30 日
是一个 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