我可以构建一个可变范围吗?

时间:2016-07-11 06:02:03

标签: python python-3.x

在执行时迭代可变对象是可变的:

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对象,它的工作方式与范围相同,但在执行时是可变的?

2 个答案:

答案 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结果,直到整个列表用完为止。