Python 如何创建具有动态范围的for循环?

Python 如何创建具有动态范围的for循环?,python,Python,我正在遍历一个列表。可以在迭代期间将元素添加到此列表中。所以问题是循环只遍历这个列表的原始长度 我的代码: i = 1 for p in srcPts[1:]: # skip the first item. pt1 = srcPts[i - 1]["Point"] pt2 = p["Point"] d = MathUtils.distance(pt1, pt2) if (D + d) >= I:

我正在遍历一个列表。可以在迭代期间将元素添加到此列表中。所以问题是循环只遍历这个列表的原始长度

我的代码:

    i = 1
    for p in srcPts[1:]:  # skip the first item.
        pt1 = srcPts[i - 1]["Point"]
        pt2 = p["Point"]

        d = MathUtils.distance(pt1, pt2)
        if (D + d) >= I:
            qx = pt1.X + ((I - D) / d) * (pt2.X - pt1.X)
            qy = pt1.Y + ((I - D) / d) * (pt2.Y - pt1.Y)
            q  = Point(float(qx), float(qy))
            # Append new point q.
            dstPts.append(q)
            # Insert 'q' at position i in points s.t. 'q' will be the next i.
            srcPts.insert(i, {"Point": q})
            D = 0.0
        else:
            D += d
        i += 1

我曾尝试对范围(1,len(srcPts))中的I使用
但是,即使在列表中添加了更多项,范围仍然保持不变。

问题是,当您将
len(srcPts)
作为参数传递给
range
生成器时,
len(srcPts)
只计算一次。因此,您需要有一个终止条件,在每次迭代期间重复计算
srcPts
的当前长度。有很多方法可以做到这一点,例如:

while i < len(srcPts):


  ....
而i
在这种情况下,您需要使用
while
循环:

i = 1
while i < len(srcPts):
    # ...
    i += 1
i=1
而i
for
循环为列表创建迭代器一次。一旦创建了迭代器,迭代器就不知道您更改了循环中的列表。此处显示的
while
变量每次都会重新计算长度

行中:

for p in srcPts[1:]:  # skip the first item.
切片生成SCRPTR的新副本,因此大小固定

免责声明:修改被迭代器遍历的列表感觉是错误的,但这是可行的

在列表上创建迭代器可防止复制,但仍允许添加和插入项:

L = [1,2,2,3,4,5,2,2,6]
it = iter(L)
next(it) # skip the first item
for i,p in enumerate(it,1):
    if p == 2:
        L.insert(i+1,7) # insert a 7 as the next item after each 2
    print(p)
输出:

2
7
2
7
3
4
5
2
7
2
7
6

谢谢,我真是个巨蟒迷。嗯,那不是真的。Python允许您更改正在迭代的列表。事实上,当你附加到一个列表时,它会扫描这个添加的元素;对于插入元素也一样。要复制列表以进行迭代,您可以在lst[:]中为i编写
或执行其他技巧。谢尔盖伊瓦诺夫:我不是说Python不允许你这么做,我是说
for
循环不知道列表被修改了。注意,OP已经在这里使用了切片。他在一个部分拷贝上循环(除了第一个元素)。@SergeyIvanov:这就是重点;OP希望循环包含添加的元素,插入到循环体中。我明白了。我指出,for循环知道在不创建副本时更改了迭代器/列表,因此可以迭代这些新添加的元素。但是,在执行切片时,会创建一个副本,并且不能在新元素上迭代。