我正在尝试在主列表级别对列表列表进行就地修改。但是,当我尝试修改迭代变量(下例中的 row
)时,它似乎创建了一个指向它的新指针而不是修改它。
我的问题的最小例子。
c = [1,2,3]
for x in c:
x = x + 3
print(c) #returns [1,2,3], expected [4,5,6]
上面的例子是我的问题的一个简单例子。有没有办法就地修改 x
元素,并让更改出现在C中?
我的问题的不那么简单的例子。我正在将所有 0 切换为 1,反之亦然。
A = [[1,1,0],
[1,0,1],
[0,0,0]]
for row in A:
row = list(map(lambda val: 1 - val, row))
print(A)
预期的
A = [[0,0,1],
[0,1,0],
[1,1,1]]
回来
A = [[1,1,0],
[1,0,1],
[0,0,0]]
更新:到目前为止很好的答案。我对迭代变量( row
在第二个示例中)如何链接到可迭代变量( A
在第二个示例中)感兴趣。
如果我执行以下操作,反转 A 的每个子列表,它就可以完美运行。
为什么下面的例子,我修改了迭代变量,但是上面的例子没有?
A = [[1,1,0],
[1,0,1],
[0,0,0]]
for row in A:
row.reverse()
print(A)
#returns, as expected
A = [[0, 1, 1],
[1, 0, 1],
[0, 0, 0]]
原文由 Alexander 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在文档中找到了这个: https ://docs.python.org/3/tutorial/controlflow.html#for
我的第一个反应是错误的,当遍历列表时,它会返回该列表中的实际项目。但是,似乎无法在迭代时直接编辑它们。这就是为什么遍历列表长度的整数有效的原因。
至于为什么
.reverse()
函数起作用,我认为这是因为它影响的是列表而不是值。我尝试在非列表数据类型上使用类似的内置函数,例如.replace()
在字符串上,但没有效果。我尝试过的所有其他列表函数都有效:
.append()
,.remove()
和.reverse()
如您所示。我不确定这是为什么,但我希望它能更清楚地说明您可以在 for 循环中做什么。回答下面的旧问题:
您使用 for 循环的方式不会影响实际列表,只会影响遍历列表的临时变量。有几种方法可以解决这个问题。您可以计算到列表的长度并直接修改列表,而不是遍历每个元素。
您还可以使用
enumerate()
函数遍历计数器和列表项。在这种情况下,n 是一个计数器,x 是列表中的项目。
最后,您可以使用列表理解生成一个新列表,其中一行包含所需的差异。