为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 2022-06-28 17:48:21
我只是想将两个排序列表合并到一个排序列表中。我知道这是一项简单的任务和大量在线解决方案,但我的问题不同。这是我的代码: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 list3if __name__ == "__main__":    print(merge([1, 2, 3, 10, 11, 22], [4, 5, 6, 7, 20, 21, 30]))我进行了调试,我很困惑地看到,当我将值 i 减少 1 时,例如从 3 到 2,在下一次迭代中它又回到 4。我不知道为什么?您可以通过运行代码并查看结果来检查它。我只需要解释为什么会这样。谢谢
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我很困惑地看到,当我将值 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 = 0

while i < len1:

   # ... loop body goes here ...

   i += 1

像这样写,i在循环体中修改会以你预期的方式影响迭代。


查看完整回答
反对 回复 2022-06-28
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您正在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)

希望这可以帮助。


查看完整回答
反对 回复 2022-06-28
?
繁花如伊

TA贡献2012条经验 获得超12个赞

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

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

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

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


查看完整回答
反对 回复 2022-06-28
  • 3 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信