如何在迭代列表时修改列表元素?

G. *_*are 1 python iterable list

在 Python 中,迭代列表时无法修改列表。例如,下面我无法修改list_1,并且结果print将是[0, 1, 2, 3, 4]。在第二种情况下,我循环遍历类实例列表,并调用该set_n方法修改列表中的实例,同时迭代它。确实,意志print给予[4, 4, 4, 4, 4]

这两个案例有何不同,为什么?

# First case: modify list of integers 
list_1 = [0, 1, 2, 3, 4]
for l in list_1:
    l += 1
print(list_1)

# Second case: modify list of class instances
class Foo:
    def __init__(self, n):
        self.n = n
        
    def set_n(self, n):
        self.n = n
        
list_2 = [Foo(3)] * 5
for l in list_2:
    l.set_n(4)
print([l.n for l in list_2])
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 7

当然可以在迭代列表时修改列表,您只需引用该列表,而不是包含列表值的变量。

for i in range(len(list_1)):
    list_1[i] += 1
Run Code Online (Sandbox Code Playgroud)

第二种情况的区别在于变量包含对可变容器对象的引用。您正在修改该对象的内容,而不是分配给变量。