[英]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
。
要通過注釋調試步驟來更進一步地映射:
> /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,因此您可以執行以下操作:
> /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
,替換了它之前綁定的任何值。
> /home/**/Documents/**/**/merge_sort.py(30)merge() -> for k in range(n):
該行尚未執行 ,因此k
仍綁定到3:
(Pdb) pk 3 (Pdb) n
現在 k
不再是3
,它將是range(n)
序列中的下一個值。
> /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.