在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])
在迭代列表的同时修改列表当然是可能的,您只需要引用列表,而不是包含列表值的变量。
for i in range(len(list_1)):
list_1[i] += 1
第二种情况的不同之处在于,变量包含对可变容器对象的引用。您正在修改该对象的内容,而不是分配给变量。