forループがある場合:
for row in list:
row = something_or_other
値(または追加/拡張など)を直接割り当てて、それに応じrow
てlist
変更を加えることができる場合もあれば、次のような回りくどいことをしなければならない場合もあります。
for row in list:
list[list.index(row)] = something_or_other
何ができるの?!?
forループがある場合:
for row in list:
row = something_or_other
値(または追加/拡張など)を直接割り当てて、それに応じrow
てlist
変更を加えることができる場合もあれば、次のような回りくどいことをしなければならない場合もあります。
for row in list:
list[list.index(row)] = something_or_other
何ができるの?!?
次のように、値row
(または一般的には反復変数が何であれ)を再割り当てすることはできません。
x = [1, 2, 3]
for x in lst:
x = # code
これは変数をx
完全に再割り当てしているためです(「x
リストのメンバーであったことを忘れてください」と言っています)。
ただし、x
が変更可能である場合、たとえばリストの場合は、次のことができます。
lst = [[1, 2], [3, 4]]
for x in lst:
x.append(10)
実際に値を(に[[1, 2, 10], [3, 4, 10]]
)変更します。技術的には、これは再バインド操作と変更操作の違いです。
row
forループ内は、元の名前にすぎません(ただし、forループ内で再割り当てすると、リンクが効果的に切断されます)。したがって、変更可能である場合は、基になるオブジェクトに反映されるメソッド(、、など)を使用できますappend
。add
extend
正しいイディオムは次のとおりです。
for rowno, row in enumerate(some_list):
some_list[rowno] = #...
に割り当てると、ではなくパフォーマンスがlst[lst.index(row)]
得られ、リストに複数の同一アイテムが含まれている場合はエラーが発生する可能性があります。O(n²)
O(n)
代わりに、リスト内包表記またはmap
:で作成された新しいリストを割り当てます。
lst = [1,2,3,4]
doubled = [n*2 for n in lst]
または、元のリストを本当に変更したい場合は、 enumerateを使用できます。
for i,n in enumerate(lst):
lst[i] = n*2