在执行时迭代可变对象是可变的:
a = [11, 12, 13]
for i in a:
if i == 12:
a.append(20)
print(i)
结果
11
12
13
20
而a
是[11, 12, 13, 20]
但如果我使用range
则不可变
a = [11, 12, 13]
for i in range(len(a)):
if i == 1:
a.append(20)
print(a[i])
结果
11
12
13
之后a
仍为[11, 12, 13, 20]
。
有没有办法构建一个myrange
对象,它的工作方式与范围相同,但在执行时是可变的?
答案 0 :(得分:2)
是的,你可以,正如你所说的那样a
已经是可变的,所以不要在循环之前迭代基于len(a)
的范围,你可以做以下事情:
for i, val in enumerate(a):
if i == 1:
a.append(20)
print(val)
输出:
11
12
13
20
答案 1 :(得分:0)
在您的第二个代码段中:
for i in range(len(a)):
if i == 1:
a.append(20)
print(a[i])
当你使用range(len(a))
时,它在这种情况下返回[0,1,2]作为a==3
的长度现在for循环将只迭代3次,因为len(a)
是在循环开始时执行,该循环已返回3个元素的列表,当您更新列表时,更改不会反映,因为len(a)
永远不会再次执行。
如果在for循环外打印a
,您将在列表末尾看到附加的元素(20)。
然而在第二种情况下,您试图遍历列表,这将继续yield
结果,直到整个列表用完为止。