在做數據分段截取的時候,發現R語言for循環的表現和其他語言不太一樣。
上代碼:
for( i in 1:4) { i = i + 1 print(i) } 結果: [1] 2 [1] 3 [1] 4 [1] 5
即作為循環計次的i, 並不會因為在循環體中的賦值變化而變化。
在Python中查看也是一樣的結果.
猜測是動態語言在生成for循環的時候, 會提前生成循環列表的下標列表, 避免在循環中對下標做操作后,導致循環結果不穩定.
這樣的機制還避免了每次循環會重新計算長度表達式的問題.
如 for x in len(str)。 在Java中,每一次循環都會執行一次len(str), 存在很大的性能開銷.
因此Java中,習慣的寫法是: length = len(str); for x in length {}
而在Python或R中則不會存在這種問題, 不管str如何變更,len(str)都只會執行一次. for x in len(str)的寫法並不會出現性能問題.
$todo: 看<Advanced R>中是否有相關的解釋。
