Python:为什么for循环表现怪异?

时间:2019-10-20 10:09:27

标签: python python-3.x

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

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。我不知道为什么?您可以通过运行代码并查看结果来进行检查。我只需要解释为什么会这样。谢谢

3 个答案:

答案 0 :(得分:3)

  

我很困惑地看到,当我将值i减1(例如,从3减为2)时,在下一次迭代时它又回到了4。我不知道为什么吗?

因为for i in range(x)的意思是“假设{0到x-1的值为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 = 0
while i < len1:
   # ... loop body goes here ...
   i += 1

这样写,修改循环体中的i将以您期望的方式影响迭代。

答案 1 :(得分:0)

这是因为range()是生成器函数。它不会像您期望的那样创建数字列表,而是根据需要生成一个新数字。而且,即使它创建了列表,这些数字也会从列表中一个接一个地获取,无论您如何修改它们。您可以将range()的结果视为“只读”。下面的user4815162342是正确的,您不应将其与C样式的循环混淆。更像是Fortran循环,其中迭代次数是预先计算的。

来自https://pynative.com/python-range-function/

  

Python 3的范围使用生成器。当进行循环迭代时,Python 3的range()将产生值。即,range()不会一次产生所有数字。

     

Python range()函数返回一个不可变的整数序列对象,因此可以将range()输出转换为Python列表。使用列表类将范围输出转换为列表。让我们通过以下示例对此进行理解。

答案 2 :(得分:0)

您正在i上运行的for循环内编辑i。我不相信它会按照您的预期工作。

此外,您可以简单地合并列表并使用以下方法对结果进行排序:

list1 = [1,2,3,10,11,22]
list2 = [4,5,6,7,20,21,30]
list3 = list1 + list2
list3.sort()
print(list3)

希望这会有所帮助。