如何修改列表中列表中的元素

s.p*_*tra 5 python list

我是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中的作用域的东西.但是,对于范围界定或上述问题,我没有得到适当的答案.

Gar*_*t R 0

正如其他人所解释的,当您使用该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]]