while + for循环和if语句下的变量范围

时间:2018-08-30 04:21:45

标签: python variables for-loop if-statement while-loop

此代码的目的是尝试输出一个元组的第二个元素与另一个元组的第一个元素相同的路由。

当i + = 1的缩进与for循环相同时,“ JFK”为原点,path =段。 我得到了['JFK','DEN','SFO','LAS','LAX','ORD','ATL'],这是正确的答案。

当i + = 1与if语句具有相同的缩进时,我仅得到['JFK','DEN','SFO','LAS']。 有人知道为什么吗?

segments = [
            ("JFK", "DEN"),
            ("DEN", "SFO"),
            ("SFO", "LAS"),
            ("LAS", "LAX"),
            ("LAX", "ORD"),
            ("ORD", "ATL"),
            ("ATL", "JFK"),
]

def get_route(path, origin):
    my_list = []
    i = 0
    list_len = len(path)
    path_copy = path.copy()

    while i <= list_len:
        for k in path_copy:
            if origin == k[0] and origin not in my_list:
                my_list.append(k[0])
                origin = k[1]
                path_copy.remove(k)
        i += 1
    return my_list

get_route(segments, "JFK")

2 个答案:

答案 0 :(得分:1)

好吧,您打算循环播放列表中所包含元素的次数。如果是这种情况,i +1处于正确的缩进级别。 while循环的每次迭代都会使i增加一。

现在,如果您将该语句向右移动四个空格,则在内部四个循环的每次迭代期间,i都会递增。这意味着变量的增加频率比其应有的增加得多,并且结果与您期望的结果有所不同。

请注意,这种循环在python中非常不常见。有很多常用的写方法。

def get_route(path, origin):

    my_list = []
    path_copy = path.copy()

    for _ in path:
        for k in path_copy:
            if origin == k[0] and origin not in my_list:

                my_list.append(k[0])

                origin = k[1]

                path_copy.remove(k)

         i += 1

    return my_list

我什至不确定我是否需要嵌套循环。可能有更好的方法编写整个方法。

答案 1 :(得分:1)

如果i += 1语句的缩进与if语句相同(位于for循环中),则您的程序将丢失一些路径节点。这是因为,如果if语句的计算结果为false,则i将递增,但您不会附加到路径列表中。

即使i += 1循环之外的for也没有用。当我运行代码时,path_copyi = 4时为空,但是i继续递增直到您的情况下达到7。这是您可能适用的代码更新版本。

def get_route(path, origin):
    my_list = []
    list_len = len(path)
    path_copy = path.copy()

    while len(my_list) < list_len:
        for k in path_copy:
            if origin == k[0] and origin not in my_list:
                my_list.append(k[0])
                origin = k[1]
                path_copy.remove(k)
    return my_list