Python中的列表与C中的数组

时间:2017-12-13 10:59:35

标签: python c arrays list

在使用python 3.6 进行编程时,我在list遇到了一些问题:

l = [2,2,3,3,3]

for n in range(len(l)):
   print(l[n+1])  #increasing value of n by 1

这段代码显然会出错:

  

IndexError:列表索引超出范围

但是在c语言的情况下:

#include<stdio.h>

int main() {
int i =0;
int arr[5] = {1,2,3,4,5};
for(i = 0 ; i<=4;i++){

    printf("%d " , arr[i+1]);
}
return(0);
}

提供正确的输出(包括垃圾值):

  

2 3 4 5 32764

我想知道为什么我们没有使用n的未来值来获取python中list的元素值,而在c中它只是反向?

1 个答案:

答案 0 :(得分:3)

在C中,“数组”主要是指向内存位置的指针(nb:这是一个明显的简化,you can read this for more details),而arr[x]将从address_of_arr + (N * x)返回N个字节(其中N是数组数据类型的大小)。与C中的所有内存访问一样,绝对没有检查,因此您可以读取(并写入)任意内存位置。

请注意,正如Daniel Pryden在评论中提到的那样,您在C示例中观察到的行为称为“未定义行为”,这意味着结果不是由C语言规范定义的,取决于实现(您的C编译器,平台和诸如此类的东西,并且实际上可以产生任何结果(包括核心转储,擦除硬盘或发射核导弹)。幸运的是,你测试它的实现只返回垃圾。现在,如果你真的很幸运,为了一点乐趣,尝试在这个记忆位置写并找出会发生什么;)

在Python中,list是一个知道它的长度的对象,不会让你尝试访问不存在的索引中的项目。有效列表内容存储在内存中的位置和方式由实现处理,并且对Python代码完全不透明。

免责声明:这个答案是基于当今操作系统中最常见的C实现 - C语言规范没有指定如何实现数组(它应该如何工作),所以一个实现也可以选择在布置在橡皮筋上的粘土片上存储阵列数据,并将该橡皮筋向左或向右移动N个位置,在这种情况下,我的答案将完全无关......