2016-10-04 66 views
0

對於這個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) 
+3

我想'因爲我在lst_u:'永遠不會結束,因爲要附加在環路本身名單。總是有更多元素可以迭代。 –

+2

'new_u = lst_u'沒用。這只是創建另一個參考,而不是副本。 –

回答

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) 
    
+0

感謝您的評論,所以我試圖將這些線性函數應用於添加到列表中的每個新元素。這是我迄今爲止提出的,但最終也會以無限循環結束。 – eeskonivich

+0

「code'def dbl_linear(N): \t \t = lst_u排序([1]) \t而LEN(lst_u) eeskonivich

+0

@eeskonivich:我不知道爲什麼你要在那裏排序一個元素的靜態定義列表。我也不知道你的縮進是否正確。我的答案*中的版本*沒有循環進入無窮大,但第三個例子確實有名稱錯誤,現在已更正。 –

相關問題