列表索引是如何工作的?

4

这个问题涉及Python:

battleships = [['0','p','0','s'],
               ['0','p','0','s'],
               ['p','p','0','s'],
               ['0','0','0','0']]
def fun(a,b,bships): 
    c = len(bships)
    return bships[c-b][a-1]

print(fun(1,1,battleships))
print(fun(1,2,battleships))

第一次打印输出为0 第二次打印输出为p

我无法理解其中的原因,如果您能给出解释,将不胜感激。

感谢那些提供帮助的人 :)


1
你期望的是什么,为什么? - Karl Knechtel
4个回答

3
索引从0开始。因此,battleships包含索引为0、1、2、3的项。
首先,len(bships)获取列表battleships的长度,该列表是一个包含4个列表的嵌套列表。
bships[c-b][a-1]通过它们的索引值访问列表中的项。因此,在您第一次调用函数时:
print(fun(1,1,battleships))

这是 bships[4-1][1-1],它是 bships[3][0],它又是 ['0','0','0','0'][0],也就是 0


@Emma 不用谢!记得在20分钟后(或任何你方便的时间)接受一个答案。 - TerryA
@Emma :) 谢谢。我刚刚发现我也是回答你的“%”问题的那个人! :p - TerryA
是的,你一直是我很大的帮助。我正在为我的计算机基础考试学习 :) 所以非常感谢你的帮助! - Emma

3
您可以通过将计算替换为实际值来轻松解决它:
在第一次调用中,您正在进行索引:
bships[c-b][a-1] == bships[4-1][1-1] == bships[3][0]

从0开始计数,那就是最后一行,['0','0','0','0'],第一个元素,'0'

第二个调用的结果为:

bships[c-b][a-1] == bships[4-2][1-1] == bships[2][0]

因此,倒数第二行的第一个单元格['p','p','0','s']是一个'p'

请注意,在Python中,您可以使用负索引而无需先计算len();从您的函数中删除c,它仍将完全相同:

>>> battleships = [['0','p','0','s'],
...                ['0','p','0','s'],
...                ['p','p','0','s'],
...                ['0','0','0','0']]
>>> def fun(a,b,bships): 
...     return bships[-b][a-1]
... 
>>> print(fun(1,1,battleships))
0
>>> print(fun(1,2,battleships))
p

这是因为Python会将负索引视为从结尾开始计数;在内部,它将使用序列的长度(存储在序列中)来计算相同的内容,但速度更快。


1
>>> battleships = [['0','p','0','s'],
...                ['0','p','0','s'],
...                ['p','p','0','s'],
...                ['0','0','0','0']]
>>> 
>>> a = 1 
>>> b = 1
>>> c = len(battleships)
>>> c-b,a-1       
(3, 0)

现在,battleships[c-b][a-1]可以分为两部分: battleships[c-b][a-1] Python首先调用battleships[c-b],因为c-b3,所以它返回battleships中的最后一个列表(第四个项目),即['0','0','0','0'](索引从0开始)。
现在来到了第二部分:[a-1] 现在,在返回的列表['0','0','0','0']上调用了[a-1]
由于a-10,所以Python返回此列表的第一项。
所以你得到了'0'。
对于不同的ab值采用相同的方法。
>>> a = 1
>>> b = 2
>>> c-b,a-1
(2, 0)
>>> battleships[c-b]
['p', 'p', '0', 's']
>>> battleships[c-b][a-1]   #calls  ['p', 'p', '0', 's'][0]
'p'

1

当你在编程中遇到难以理解的新事物时,可以尝试对程序进行一些修改。

我来举个例子。我稍微改了一下它。

battleships = [['0','p','0','s','3'],
               ['0','p','0','s','8'],
               ['p','p','0','s','2']]

print "len(battleships) =",len(battleships)
print "battleships[0] =",battleships[0]
print "battleships[1] =",battleships[1]
print "battleships[2] =",battleships[2]
print "len(battleships[0]) =", len(battleships[0])

当我运行它时,输出为:
len(battleships) = 3
battleships[0] = ['0', 'p', '0', 's', '3']
battleships[1] = ['0', 'p', '0', 's', '8']
battleships[2] = ['p', 'p', '0', 's', '2']
len(battleships[0]) = 5

将输出语句与打印语句匹配。这会有所帮助。

尝试使用print battleships[0][1]等等。


还有一个建议。在Google上搜索Python并在您的计算机上安装它。如果我没错的话,这是来自Codecademy。仅使用Codecademy将不足以学习Python。您需要编写Python脚本,运行它们并查看它们的输出。只有在此之后您才能学到东西。尝试this。他们比Codecademy更擅长教授编程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接