抱歉,如果这是一个愚蠢的问题。我的理解是,如果我想就地更新列表中的项目
l = [1, 2, 3]
for i in range(len(l)):
l[i] += 1
这个有效
l = [1, 2, 3]
for num in l:
num += 1
这不是因为在 foreach 循环中,在每次迭代中
num
都会创建 l
中每个元素的副本。但如果我想修改嵌套列表
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for i in range(len(l)):
for j in range(len(l[i])):
l[i][j] += 1
和
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for sublist in l:
for i in range(len(sublist)):
sublist[i] += 1
两者都有效,并且
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for sublist in l:
for num in sublist:
num += 1
不起作用。 所以现在我真的很困惑,如果 for every 循环创建
l
中元素的副本,那么第二个不应该不起作用,因为 sublist
是 l
中列表的副本,然后下一个 for 循环修改 sublist
中的元素而不是 l
中的列表,因此 l
不应更改。但确实如此,有人可以向我解释一下吗,提前谢谢。
这有效:
for i in range(len(l)):
l[i] += 1
因为你正在递增
l[i]
。相当于:
for i in range(len(l)):
l[i] = l[i] + 1
这不:
for num in l:
num += 1
因为您只是增加一个单独的值。相当于:
for i in range(len(l)):
num = l[i]
num = num + 1
您可能期望
for num in l
为您提供 num
到 l
的每个元素的参考。但您实际上只是按顺序获取 l
中每个元素的 value。增加值并没有真正做任何事情。可能令人困惑的是,当同样的情况发生在可变对象上时。例如:
num
这确实修改了列表中的字典,因为列表中的值是实际的字典,然后可以在循环中修改它,并且由于这些字典也在列表中,所以你会得到你所期望的。