Python:为什么 for 循环的行为很奇怪?

我只是想将两个排序列表合并到一个排序列表中。我知道这是一项简单的任务和大量在线解决方案,但我的问题不同。这是我的代码:


def merge(list1, list2):

    len1 = len(list1)

    len2 = len(list2)


    list3 = []

    pointer = 0


    for i in range(len1):

        if (list1[i] >= list2[pointer]):

            while (pointer < len2 and list1[i] >= list2[pointer]):

                list3.append(list2[pointer])

                pointer += 1

            i -= 1

        else:

            list3.append(list1[i])


    while (pointer < len2):

        list3.append(list2[pointer])

        pointer += 1


    return list3



if __name__ == "__main__":

    print(merge([1, 2, 3, 10, 11, 22], [4, 5, 6, 7, 20, 21, 30]))

我进行了调试,我很困惑地看到,当我将值 i 减少 1 时,例如从 3 到 2,在下一次迭代中它又回到 4。我不知道为什么?您可以通过运行代码并查看结果来检查它。我只需要解释为什么会这样。谢谢


汪汪一只猫
浏览 198回答 3
3回答

幕布斯7119047

我很困惑地看到,当我将值 i 减少 1 时,例如从 3 到 2,在下一次迭代中它又回到 4。我不知道为什么?因为意味着“以 0 到 x-1 的值for i in range(x)执行for主体”。i分配不同的值i不会影响其在下一次迭代中的值。换句话说,for i in range(10)不是C 或 JavaScript 的翻译for (i = 0; i < 10; i++)。相反,您可以将其视为for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. 如此看来,很明显,改变一个 的值i不会影响后面的值,后者是盲目地从预先生成的列表中取出的。如果需要根据变化的条件修改迭代进度,可以显式编写C/JS风格的循环:i = 0while i < len1:&nbsp; &nbsp;# ... loop body goes here ...&nbsp; &nbsp;i += 1像这样写,i在循环体中修改会以你预期的方式影响迭代。

哆啦的时光机

您正在i在运行的 for 循环内进行编辑i。我不相信它会按照你想要的方式工作。此外,您可以简单地合并列表并对结果进行排序:list1 = [1,2,3,10,11,22]list2 = [4,5,6,7,20,21,30]list3 = list1 + list2list3.sort()print(list3)希望这可以帮助。

繁花如伊

这是因为range()它是一个生成器函数。它不会像您期望的那样创建数字列表,而是根据需要生成一个新数字。而且,即使它创建了列表,数字也会一个接一个地从列表中取出,无论您如何修改它们。在某种意义上,您可以将结果range()视为“只读”。下面的 user4815162342 是对的,你不应该将它与 C 风格的循环混淆。更像是一个 Fortran 循环,其中迭代次数是预先计算的。来自https://pynative.com/python-range-function/:Python 3 的范围使用生成器。Python 3 的 range() 将在 for 循环迭代请求时产生值。即,它 range() 不会一次产生所有数字。Python range() 函数返回一个不可变的整数序列对象,因此可以将 range() 输出转换为 Python 列表。使用列表类将范围输出转换为列表。让我们通过以下示例来理解这一点。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python