pythonでfor文を使う際の注意点

簡単なスクレイピング処理を行い、HTMLをCSVにまとめる作業中に見事にドハマリしてしまったので、反省の念を込めて覚書。
優秀なプログラマならこんな勘違いはしなくて済むのだろうか…猛省である。

ls = list( ([1,2],[3,4],[5,6]) )
print ls

for i in ls:
__temp = i[0]
__i[1] = i[1]
__i[1] = temp

print ls

このコードの実行結果では見事、lsの各要素に対して入れ換えが起こっていた。
これはfor文の頭でiに渡されるのはlsの要素への参照だからであろう。

それでは、こちらはどうだろうか。

ls = list( (1,2,3,4,5) )
print ls

for i in ls:
__i = i + 1

print ls

このようなコードを実行しても、リストlsの中身は[2,3,4,5,6]とはなってくれない。
また、同様にiに対して何らかの変数を代入してもlsの内容に変わりはなかった。
つまりこのコードにおいては、for文の先頭において変数iに代入されるのは、lsの要素への参照ではない…?

否。たしかにこちらのfor文でもlsの要素への参照である。
では先ほどと何が違うのか。
それは、参照に対して行う操作が違うのである。

上の方の例では、i[N]という値は、iの参照を用いて、ls(実体)の要素を操作していた。
ところが下の例では、i+1では、iの参照先の値(つまり1や2といった数値)を見ているのに対し、
iへの代入という操作は、iという変数に新しい実体(i+1)への参照を渡していることとなる。
すなわちiにどのような操作を施してもlsは影響を受けないわけだ。

c/c++のような厳格?な言語なら、「まず無理だろう」というスタンスで調べて、やっぱりダメか…
と、おとなしくインデックスつかってfor文を回すから、こんな失敗はおきないのだけれど、
pythonjavascriptなんてライトな言語だとついついやってしまうので、気を付けたい。