在一個while回圈中,條件被迭代地重新評估。例子:
while i < len(nums):
最新索引i和最新長度nums都用于重新評估條件。
在 for 回圈中情況并非如此。例子:
for i in range(len(nums)):
range(len(nums))即使長度發生nums變化(例如,由于回圈中的彈出值),此處也會創建并保持不變。我對這個程序的理解正確嗎?有沒有辦法讓 for 回圈依賴于“移動的球門柱”(變化的nums長度)?
uj5u.com熱心網友回復:
在 for 回圈中不是這種情況
不,這是您創建range物件時的情況。range不存盤nums對它的參考只需要整數。如果你有一個清單
ls = [0, 1, 2, 3]
然后你可以寫:
for i in ls:
ls.append(i)
并且回圈將永遠運行,因為您每次都i從中獲取ls并被添加。ls不過,我不建議嘗試使用它來實作您的目標。在這里使用 while 回圈很有意義。
uj5u.com熱心網友回復:
您可以使用 enumerate(nums) 遍歷串列以獲取當前索引,如果串列變長,您仍然可以走得更遠。
在下面的示例中,我使用 random 有機會在每次迭代中應用一個新專案。
>>> import random
>>>
>>> nums = ["a", "a"]
>>>
>>> for i, val in enumerate(nums):
... if random.randint(0, 1)==0:
... nums.append("b")
... print(str(i) ":" val)
...
0:a
1:a
2:b
3:b
uj5u.com熱心網友回復:
您可以使用變數并為每個回圈設定陣列的長度
nums = [1, 2 ,3 ,4]
i=0
array_length=len(nums)
while i < array_length:
nums.pop()
print(nums)
array_length=len(nums)
uj5u.com熱心網友回復:
您可以制作一個簡單地隱藏while回圈的生成器。
def range_len(lst):
i = 0
while i < len(lst):
yield i
i = 1
for i in range_len(nums):
...
這是沒有意義的,只是為了證明一個for回圈可以迭代一個不斷變化的可迭代物件。它之所以有效,是因為lst生成器內部的物件是相同的物件nums,因此每次迭代都會重新評估其長度。
uj5u.com熱心網友回復:
如果有必要的理由使用 for 而不是 while 那么這里有一些想法:
如果目的是避免由于串列在運行時縮小而超出串列邊界(我沒有對此進行測驗),那么我將在主體的關鍵部分設定一個條件,以針對 len(n) 重新評估 i 和相應地打破。
如果意圖是在長度擴大的情況下繼續使用 for 回圈,那么也許我會考慮嵌套回圈,外部是 while True 具有中斷條件(如果我達到 len(n))。在這種情況下,內回圈的起始值并不總是為零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/461296.html
上一篇:為什么回圈的序列在Python中似乎不能很好地作業?
下一篇:MS訪問用最近的非零行替換非零值
