更新嵌套列表Python中的项目时`for item in list`和`for i in range(len(list))`之间的区别

问题描述 投票:0回答:1

抱歉,如果这是一个愚蠢的问题。我的理解是,如果我想就地更新列表中的项目

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
不应更改。但确实如此,有人可以向我解释一下吗,提前谢谢。

python for-loop nested-lists
1个回答
0
投票

这有效:

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

这确实修改了列表中的字典,因为列表中的值是实际的字典,然后可以在循环中修改它,并且由于这些字典也在列表中,所以你会得到你所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.