c语言和python的数组-python的list和c的数组有什么区别?

C语言数组元素为同一种数据类型,且一般须指定数组长度。

而Python的list,首先其内容本质上是引用的序列,引用指向实际的对象;其次其长度是动态变化的。具体讲来,像在Python这样的更现代的高级语言中,已经越来越避免让程序员主动去指定一个类似数组这样的数据结构的长度,以由此决定对相应对象的内存分配。这个工作已经被语言给封装好,使得程序员编码更加方便自由,同时也规避了很多来源于内存或是指针相关的错误和陷阱。

当然内存的硬件组织并没有发生根本性的改变,在底层显式地指定一段序列的长度和单位大小依然是准确分配和使用内存空间的必需。这对Python中的那些不可变类型的对象,比如:字符串(str)和元组(tuple),并不会产生问题,因为这些对象一旦初始化在内存中便是固定的。但是,列表(list)允许不断地在现有列表上添加删除和修改其元素,显然长度的不断变化不能由指定长度的内存空间满足,为此引入了动态数组(dynamic array)的概念。

动态数组其实在底层同样是建立在一段连续的内存空间上,由指定长度的静态数组(内存空间)来实现数据存储和读取的,只是通常这个静态数组的容量会大于列表现有元素的长度。这样在大多数情况下,向列表添加元素的操作就和传统的方式一样,在指定长度的静态数组中下一个空位添加该元素即可。

如果不断向上述的静态数组中添加新元素,迟早静态数组保留的多余空间也会被占满。当空间被耗尽时,列表(动态数组)不同于静态数组,将向系统申请一个更大的静态数组。然后,列表将会将之前的静态数组的内容复制到新的更大的静态数组中去。此时,原来的静态数组便没有存在的价值,而可由系统回收作垃圾收集,因为数据已经被转移保存到新的更大的静态数组中去了。

/>

由动态数组实现的列表其实可以看做是一个寄居蟹,而它所依赖的静态数组则可以看做是固定大小的贝壳。寄居蟹总是找到那些能投容纳它身体的贝壳栖身,而当身体长大难以被现有贝壳容纳时,则需要寻找更大更宽敞的贝壳来当做新家。这边是更现代的高级语言脱离像C语言的内存指定方式,而迈向更灵活高效并且不易出错的动态数组的基本原理。

此回答主要转自本人博客寄居蟹动态数组。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值