簡體   English   中英

范圍(n)中的i超過指定限制n的python循環

[英]python loop for i in range(n) exceeding specified limit n

我正在嘗試在程序中為合並排序調試合並方法。 方法如下:

def merge(self, leftarray, rightarray):
        n = len(leftarray) + len(rightarray)
        print "len(leftarray) = "+str(len(leftarray))
        print "len(rightarray) = "+str(len(rightarray))
        i = 0
        j = 0
        merged = []

        for k in range(n):
            if i == len(leftarray):
                merged.extend(rightarray[j:])
                k += len(rightarray[j:])

            elif j == len(rightarray):
                merged.extend(leftarray[i:])
                k += len(leftarray[i:])

            elif leftarray[i] <= rightarray[j]:
                merged.append(leftarray[i])
                i += 1

            elif leftarray[i] > rightarray[j] :
                merged.append(rightarray[j])
                j += 1

        return merged

for k in range(n)中的for k in range(n)是出現問題的循環。 這是調試器跟蹤:

> /home/**/Documents/**/**/merge_sort.py(36)merge()
-> elif j == len(rightarray):
(Pdb) n
> /home/**/Documents/**/**/merge_sort.py(37)merge()
-> merged.extend(leftarray[i:])
(Pdb) n
> /home/**/Documents/**/**/merge_sort.py(39)merge()
-> k += len(leftarray[i:])
(Pdb) n
> /home/**/Documents/**/**/merge_sort.py(30)merge()
-> for k in range(n):
(Pdb) p k
3
(Pdb) n
> /home/**/Documents/**/**/merge_sort.py(31)merge()
-> if i == len(leftarray):
(Pdb) p n
3
(Pdb) 

從跟蹤中可以看出, n值為3,並且當k為3時,執行不應進入循環。但是, if i == len(leftarray):執行到該行if i == len(leftarray):而不是return merged

在執行之前, Python向您顯示了for k in range(n)行中的for k in range(n) 因此, k仍然綁定到觸摸它的最后一個命令的結果:

k += len(leftarray[i:])

for循環將range(n)系列中的下一個值分配給k 之后 ,需要打印k

要通過注釋調試步驟來更進一步地映射:

  1.  > /home/**/Documents/**/**/merge_sort.py(36)merge() -> elif j == len(rightarray): 

    k保持不變,仍然設置為for k in range(n)設置for k in range(n)

     (Pdb) n 

    您現在執行了j == len(rightarray)測試,發現它為true,因此您可以執行以下操作:

  2.  > /home/**/Documents/**/**/merge_sort.py(37)merge() -> merged.extend(leftarray[i:]) (Pdb) n > /home/**/Documents/**/**/merge_sort.py(39)merge() -> k += len(leftarray[i:]) 

    merged已擴展,您已踩到k += len(leftarray[i:])行。 k仍綁定到為其分配的循環的值。

     (Pdb) n 

    現在,您執行了k += len(leftarray[i:])並且k現在設置為3 ,替換了它之前綁定的任何值。

  3.  > /home/**/Documents/**/**/merge_sort.py(30)merge() -> for k in range(n): 

    該行尚未執行 ,因此k仍綁定到3:

     (Pdb) pk 3 (Pdb) n 

    現在 k不再是3 ,它將是range(n)序列中的下一個值。

  4.  > /home/**/Documents/**/**/merge_sort.py(31)merge() -> if i == len(leftarray): (Pdb) pn 3 

    您現在需要再次測試k 取值為1或2,具體取決於您在迭代過程中的位置。

for循環確定循環開始時的迭代器; 您為它提供了range()序列,它將按照您設置的順序進行。 您不能更改k並期望它不會被序列中的下一個值替換。

您可以使用while循環來代替:

k = 0
while k < n:
    # do things, including altering k further
    k += 1

這是一個有趣的陷阱,與for范圍成語有關:它不是C for循環。 循環將以值k = 0到n-1運行n次,而不管循環主體中k的修改方式如何。 如果要模擬C樣式的for循環(您可以在其中通過更改loop變量提前終止),請改用while循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM