为什么我得到一个无限循环?

时间:2016-10-04 17:12:15

标签: python loops

对于这个python问题,我在一个参数中接受一个int,这是我要附加的列表的最大长度。从int值1开始,我想遍历列表,追加两个更多的线性值,直到达到最大长度。

我得到一个无限循环或类似的东西;我没有收到任何值,但python仍在处理中。

这是无限循环发生的代码,想知道为什么? 代码:

   def dbl_linear(n):
        lst_u =[1]
        while len(lst_u)<=n:
            for i in lst_u:
                lst_u.append(2*i+1)
                lst_u.append(3*i+1)
        return sorted(lst_u)

dbl_linear(10)

我查看了这个示例,用户已将变量设置为另一个包含for循环之前的列表的变量,然后在循环之后将其更改回来。想知道为什么这样做以及为什么它有用? 其他代码: d

ef dbl_linear(n):
    lst_u =[1]
    while len(lst_u)<=n:
        new_u = lst_u
        for i in lst_u:
            new_u.append(2*i+1)
            new_u.append(3*i+1)
        new_u=lst_u
    return sorted(lst_u)

dbl_linear(10)

1 个答案:

答案 0 :(得分:1)

当您循环播放列表时,您将添加到列表中。列表迭代器只是递增位置计数器并返回该索引处的值,直到索引不存在。它没有预先跟踪列表的长度。在您的情况下,通过向末尾添加更多元素,迭代器永远不会到达不存在的索引。

您有几种选择:

  • 首先创建列表的副本以进行迭代;那份副本不会成长:

    def dbl_linear(n):
        lst_u = [1]
        while len(lst_u)<=n:
            for i in lst_u[:]:  # [:] returns a shallow copy
                lst_u.append(2*i+1)
                lst_u.append(3*i+1)
        return sorted(lst_u)
    
  • 附加到单独的新列表并在循环后扩展原始文件:

    def dbl_linear(n):
        lst_u = [1]
        while len(lst_u)<=n:
            new_values = []
            for i in lst_u:
                new_values.append(2*i+1)
                new_values.append(3*i+1)
            lst_u.extend(new_values)
        return sorted(lst_u)
    
  • 使用range()生成索引;这是基于长度一次

    def dbl_linear(n):
        lst_u = [1]
        while len(lst_u)<=n:
            for idx in range(len(lst_u)):
                i = lst_u[idx]
                lst_u.append(2*i+1)
                lst_u.append(3*i+1)
        return sorted(lst_u)