我只是想知道如果變數是for回圈(或while回圈)陳述句會發生什么。是否只會在第一次執行該陳述句時評估該變數?
例如:
arr = [2, 3, 4]
for i in range(len(arr)):
arr.append(5)
uj5u.com熱心網友回復:
是的。試試看:
>>> arr = [2, 3, 4]
>>>
>>> for i in range(len(arr)):
... arr.append(5)
...
>>> arr
[2, 3, 4, 5, 5, 5]
如您所見,回圈有 3 次迭代,因為這是len(arr)回圈開始時的值。
這就是在迭代串列時通常不鼓勵修改串列(或任何其他可迭代物件)的確切原因;結果可能并不總是直觀的,因為迭代器是在回圈開始時設定的,修改串列可能會導致它以意想不到的方式運行(跳過專案等)。
uj5u.com熱心網友回復:
是否只會在第一次執行該陳述句時評估該變數?
是的,如果我正確理解了您的問題,則 for 回圈標頭中的運算式僅計算一次。您可以通過創建自己的函式來驗證這一點,該函式列印一條訊息然后回傳陣列的長度。
def my_fun(my_list):
print("Inside my function.")
return len(my_list)
arr = [2, 3, 4]
for i in range(my_fun(arr)):
arr.append(5)
print(arr)
輸出:
Inside my function.
[2, 3, 4, 5, 5, 5]
如您所見,訊息只列印一次,因此range(my_fun(arr))只能評估一次。
uj5u.com熱心網友回復:
這里的代碼相當于:
arr = [2, 3, 4]
r = range(len(arr))
for i in r:
arr.append(5)
print(arr)
這里對 range 函式的呼叫會生成一個 range 型別的新物件(https://docs.python.org/3/library/stdtypes.html#typesseq-range)。因此,通過 for 回圈的迭代是針對物件的r,而不是針對物件的arr。因此,回圈中的修改arr不會對回圈本身產生任何影響,因為這是在 object 上的r。
另一方面,如果我們嘗試以下代碼:
arr = [2, 3, 4]
for i in arr:
arr.append(5)
if len(arr) > 15:
break
print(arr)
我們得到以下結果:
[2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
這里 for 回圈直接應用于arr,因此它的修改確實會影響 for 執行的迭代。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494928.html
下一篇:模型選擇只回傳攔截模型
