我正在从PY4E教科书中进行练习。在字符串部分,我们进行了一个练习,其中我们必须向后打印出字符串的字符。
在执行程序之前,我认为代码已经足够好了。在调试时,我发现索引的值突然变为-7。
我知道放置if和break语句可以解决此问题,但我只是想知道为什么会这样。提前谢谢!
答案 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
是否为负!