【发布时间】:2018-05-27 05:53:56
【问题描述】:
在 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 中获取列表元素的值,而在 c 中它只是相反?
【问题讨论】:
-
C 不关心数组的索引,你可以声明一个长度为 5 的数组并访问第 6 个元素。但是,它会为您返回第 6 个元素的垃圾值。 Python 很严格,会返回一个
IndexError。 -
@BoRRis 只是因为语言不允许你
-
@BoRRis 这远远超出了本站的范围,我们不是来解释 C 和 Python 的底层内存结构是如何工作的,我建议你去学习 C 然后阅读 Python 源代码代码
-
您的 C 程序不“正确”:它调用未定义的行为,并且在访问
arr[5]时也可能崩溃,或者做一些更糟糕的事情。你不能保证得到任何价值,即使是垃圾。在 Python 中,您肯定会得到IndexError。 -
@SagunShrestha:“C 不关心数组的索引,你可以声明一个长度为 5 的数组并访问第 6 个元素。” - 绝对不是! 没有第 6 个元素。如果您调用未定义的行为,您将失去该语言提供的任何保证。