增量发生之前应该发生

时间:2012-08-29 14:46:56

标签: python for-loop

a_string = 'abc'

destination = [2, 3]    

edges = { (1, 'a') : [2, 3],
          (2, 'a') : [2],
          (3, 'b') : [4, 3],
          (4, 'c') : [5] }

def make(a_string, destination, edges):
    n = 0
    while n + 1 < len(a_string):
        letter = a_string[n]
        letter2 = a_string[n + 1]
        for d in destination:                              # (1)
            if (d, letter2) in edges:
                for state in edges[(d, letter2)]:
                    destionation.append(state)
            destination.remove(d)
        n += 1                                             # (2)
    return destination

代码返回[],但我希望看到[5],所以我认为问题是它会意外地增加n然后更改letter2。 为什么在完成n循环(位置1)之前,此代码会增加for(在位置2)?

3 个答案:

答案 0 :(得分:1)

在循环完成之前,

n不会递增。 您可能缺少的是while循环检查n + 1而不是n。

现在编辑我们有更多信息:

问题是您要从具有未定义行为的迭代器中删除项目。

for d in destination[:]:

这是整个数组的切片运算符,因此它充当复制构造函数。 您现在正在循环其他对象,并且删除应该是安全的。

答案 1 :(得分:0)

如果在循环结束时没有添加1到n,则循环条件保持不变,循环将永久执行。它不是在for循环中执行,而是在while循环体中执行。 (缩进确定一行所属的代码块!)

答案 2 :(得分:0)

你也可以迭代字符串,并使用index字符串方法,你可以抓住字符的下一个位置。

将这两者结合起来,可以简化初始外循环:

def make(a_string, destination, edges):

    for letter in a_string:
        while a_string.index(letter)+1 < len(a_string):
            next_letter = a_string[a_string.index(letter)+1]

此外,您不应将变量命名为string,因为它是模块的名称。