新手问题Python:为什么索引值发生变化?

时间:2020-09-23 03:20:33

标签: python

我正在从PY4E教科书中进行练习。在字符串部分,我们进行了一个练习,其中我们必须向后打印出字符串的字符。

在执行程序之前,我认为代码已经足够好了。在调试时,我发现索引的值突然变为-7。

我知道放置if和break语句可以解决此问题,但我只是想知道为什么会这样。提前谢谢!

screen capture of browser tab with code on programiz

5 个答案:

答案 0 :(得分:1)

您可能想尝试以下代码:

while index >= 0: # or > -1
    letter = fruit[index]
    print(letter, index)
    index = index - 1

在您的情况下,您正在重复while,而索引小于字符串的长度。这将永远是正确的,因为您将索引递减1。0 < len(fruit)-1 < len(fruit)-2 < len(fruit),等等。

fruit[-1]不会引起IndexError的原因是因为负数索引的意思基本上是从背面。该错误只会在index = -7时出现,因为"banana"的后面没有第7个值。

因此,您还可以将代码重写为:

index = 1
while index <= len(fruit):
    letter = fruit[-index]
    print(letter, len(fruit) - index)
    index = index + 1

程序的小技巧,您可以用更常规的方式重写index = index - 1,例如:

index -= 1

这也适用于其他任何运算符:+= .../= ...等。

答案 1 :(得分:0)

您的len(fruit)将为6,而index < len(fruit)将始终返回true,因为您从5开始并在循环的每次迭代中减小其值。在python中获取负索引会从右侧开始并向左移动,因为有6个字符,您会得到一个IndexError表示-7,因为该字符将出现在“香蕉”一词之前,该词不存在。 / p>

答案 2 :(得分:0)

您的意思是,为什么它在-7失败 ?如何获得很容易-您每次迭代都会不断减去1。

负列表索引在python中有效。 lst[0]表示lst的第一个元素,而lst[-1]表示 last 元素。因此,包含n个元素的列表具有有效的正索引,索引号最高为(n-1),负索引的索引号最低为-n

每当您尝试访问列表之外的列表索引时,都会得到一个IndexError。在这种情况下,任何大于5的索引(列表具有六个元素,因此最后一个索引为5)或小于-6(列表具有六个元素,因此“第六至最后一个”元素是索引中的第一个)列表),将导致IndexError发生。

如上所述,另一个答案为该问题提供了一些实用的解决方案。我个人更希望使用for循环:

for char in reversed(fruit):
    print(char)

答案 3 :(得分:0)

您可以改用它:

for i in reversed(range(len(fruit))):
    letter = fruit[index]
    print(letter, index)

发生的事情是您正在创建一个无限循环,因为索引在递减后总是小于水果的长度。

它在6处停止,因为这是单词“香蕉”的最大负索引(Python支持负索引)。

为此,我认为您应该打印: 一种 ñ 一种 ñ 一种 b 一种 ñ 一种 ñ 一种 b

答案 4 :(得分:0)

要回答您的问题,代码将按照您的要求进行操作:index小于fruit的长度时,请执行letter = fruit[index]。它不会检查index是否为负!