我是Python的新手,试图学习基础知识.对列表有疑问.
有一个清单:
L = [[1,2,3],[4,5,6],[3,4,6]]
Run Code Online (Sandbox Code Playgroud)
输出应该是:
[[2,4,6],[8,10,12],[6,8,12]]
Run Code Online (Sandbox Code Playgroud)
适用于我的代码如下
for x in range(len(L)):
for y in range(len(L[x])):
L[x][y] = L[x][y] + L[x][y]
print L
Run Code Online (Sandbox Code Playgroud)
它给出了输出[[2,4,6],[8,10,12],[6,8,12]].
现在我希望使用不同的代码输出相同的输出:
for x in L:
a = L.index(x)
for y in L[a]:
b = L[a].index(y)
L[a][b] = L[a][b] + L[a][b]
print L
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,获得的输出是:
[[4,2,6],[8,10,12],[12,8,6]]
Run Code Online (Sandbox Code Playgroud)
我试着调试上面的输出.我"L[a][b] = L[a][b] + L[a][b]"在打印a和b 的行上面打印了一个打印声明.我很惊讶地看到a和b的值是:
0,0
0,0
0,2
1,0
1,1
1,2
2,0
2,1
2,0
Run Code Online (Sandbox Code Playgroud)
再次,如果我注释掉该行,"L[a][b] = L[a][b] + L[a][b]"那么a和b的值是预期的:
0,0
0,1
0,2
1,0
1,1
1,2
2,0
2,1
2,2
Run Code Online (Sandbox Code Playgroud)
我怀疑这可能是由于python中变量的范围而发生的,并试图研究一些关于python中的作用域的东西.但是,对于范围界定或上述问题,我没有得到适当的答案.
正如其他人所解释的,当您使用该index函数时,它会找到您正在搜索的值的第一次出现。所以第一次循环(第一行),看起来像
b = 1
[1,2,3].find(1) # returns index 0
#Then you modify the first element of the list
b = 2
[2,2,3].find(2) #returns index 0 again!
Run Code Online (Sandbox Code Playgroud)
为了以更简单、更确定的方式获取索引,您可以使用enumerate列表上的函数。它将为您提供一个迭代器,当您在列表中移动时,该迭代器会返回索引和值。
for rowInd, x in enumerate(L):
for colInd, y in enumerate(x):
L[rowInd][colInd] = y + y
Run Code Online (Sandbox Code Playgroud)
请注意,这将就地完成,就像在您的原始解决方案中一样。
L = [[2, 4, 6], [8, 10, 12], [6, 8, 12]]