【问题标题】:variable scope under while+for loop and if statementwhile+for 循环和 if 语句下的变量范围
【发布时间】:2018-08-30 04:21:44
【问题描述】:

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

当 i += 1 与 for 循环具有相同的缩进时,“JFK”是原点,路径 = 段。 我得到了 ['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")

【问题讨论】:

  • 请提供您传递的参数以测试您的功能/方法
  • 是分段。
  • get_route(segments,segments) 似乎不起作用?你是这样称呼的吗?
  • 完成编辑

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


【解决方案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

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

【讨论】:

    【解决方案2】:

    如果i += 1 语句与if 语句具有相同的缩进(它在for 循环中),那么您的程序将丢失一些路径节点。这是因为如果 if 语句被评估为 false,i 将增加,但您不会附加到路径列表中。

    即使在for 循环之外使用i += 1,它也无济于事。当我运行代码时,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
    

    【讨论】:

    • 这很奇怪,即使 i += 1 在 for 循环之外它也没有任何用处。 i = 4 时 path_copy 为空。
    • 你知道为什么会这样吗?
    • 因为 for 循环。在 i 加一之前它会循环多次
    • i += 1 仅在满足 if 语句的要求时执行,这意味着删除了其中一个元组。在此之前,不会删除一个元组,也不会更改 i。我仍然不明白为什么列表在我达到限制之前就变空了。
    猜你喜欢
    • 2013-08-14
    • 2023-03-31
    • 2013-06-09
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2012-06-18
    • 2015-05-19
    相关资源
    最近更新 更多