[英]Python: What happens when inner for loop finds a member that satisfies the conditional? Does it continue iterating?
我正在嘗試選擇排序算法。 有以下代碼:
def selectionSort(list):
for i in range(len(list)-1):
curr_min=i
for j in range(i+1, len(list)):
if list[j]<list[curr_min]:
curr_min=j
temp=list[curr_min]
list[curr_min]=list[i]
list[i]=temp
一般來說,我對 for 循環有一些不明白的地方,我將嘗試從這個例子中提出問題。 我了解算法的工作原理。 首先我們curr_min
分配第一個索引 [0]。 然后 for 循環遍歷下一個元素。 假設它找到了一個小於第一個元素的元素。 然后當前最小值將被分配該元素的索引。
假設我們有以下數組: nums=[3, 5, 2, 4, 6, 1, 8]
。 當前索引為零,元素為 3。內部 for 循環開始迭代並找到 2。當前索引被分配 2(索引,而不是數字)。
然而,在那之后會發生什么? 內部循環是否會繼續迭代,它會在索引 5 處找到元素 1 並將該值分配給當前最小值?
或者內部循環會停止並且外部循環會增加,因此curr_min
變為 1(第二個 i)? 我知道這種方式沒有意義,但是,我也看不出是什么阻止了它這樣做。
另一件事,假設前者發生並且 curr_min 被分配了 5 的值。(1 的索引)。 為了curr_min
保持該值,那么外部循環必須停止對嗎? 如果它繼續,那么curr_min
將變為 1(第二個 i),因此我們在內循環中所做的所有事情都變得無用。 由於這段代碼工作正常,我假設這不會發生,但是我再一次看不到是什么阻止了外循環繼續並將它自己的值分配給變量。
希望這聽起來不會太亂,而且很清楚我的問題是什么。 非常感謝任何幫助,謝謝
整個塊在外循環的每次迭代中運行:
curr_min=i
for j in range(i+1, len(list)):
if list[j]<list[curr_min]:
curr_min=j
temp=list[curr_min]
list[curr_min]=list[i]
list[i]=temp
同樣對於外循環的每次迭代,內循環都會運行到完成。 當該內循環完成時,控制還沒有返回到外循環:首先完成該塊的其余部分。 在這種情況下,就是這個代碼:
temp=list[curr_min]
list[curr_min]=list[i]
list[i]=temp
這些行將索引 i 處的元素與索引 curr_min 處的元素交換。 之后,不再需要 curr_min。 它的價值確實丟失了,並且在下一次迭代中使用了一個新的。 沒問題,它已經完成了它的工作:指示要與索引 i 處的元素交換哪個元素。
也許嵌套循環首先通過一個非常簡單的示例向您解釋,如下所示:
for x in range(0, 10):
for y in range(0, 20):
... # do something with x and y
在這種情況下,在內循環完成后,控制確實返回到外循環,只是因為它之后什么都沒有。 但實際發生的情況與往常一樣:每個塊在控制返回到外部語句之前完全運行(在某些情況下除外:raise、continue、break、return)。
您可以使用 Python Tutor 單步執行代碼(向前和向后)並查看每時每刻發生的情況,以便更好地了解正在發生的事情: Python Tutor with your code
循環將繼續迭代,直到出現以下情況之一:
for i in range(x):
,當range(x)
的所有元素都已被迭代時。break
表達式sys.exit()
假設我們有以下數組:nums=[3, 5, 2, 4, 6, 1, 8]。 當前索引為零,元素為 3。內部 for 循環開始迭代並找到 2。當前索引被分配 2(索引,而不是數字)。
然而,在那之后會發生什么? 內部循環是否會繼續迭代,它會在索引 5 處找到元素 1 並將該值分配給當前最小值?
內部循環將繼續迭代。 正如您所說,它將在索引 5 處找到元素 1 並將該值分配給當前最小值。
另一件事,假設前者發生並且 curr_min 被分配了 5 的值。(1 的索引)。 為了讓 curr_min 保持該值,那么外部循環必須停止對嗎?
外循環不會停止。 值得注意的是,外循環增加了內循環的起始索引。 內部循環從該索引開始查找剩余數組中的最小值。
考慮外循環的前兩次迭代。 首先,內部循環找到最小值 1 並將其交換到索引 0。數組現在是[1, 5, 2, 4, 6, 3, 8]
。 這是一個進步,因為數組的最小元素位於它應該在最終輸出中的開頭。 我們現在可以忽略第一個值為 1 的元素,因為它在索引 0 處的正確位置。外循環將內循環的起始索引從 0 遞增到 1。現在內循環再次重復,在索引 0之后的數組並將其交換為索引 1。然后數組是[1, 2, 5, 4, 6, 3, 8]
,所以我們再次取得了進展......前兩個元素是 1,2 in正確的地方。 等等
我建議將變量list
更改為不同的名稱。 List 是 Python 中的保留字,因此可能會導致一些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.