1

forループがある場合:

for row in list:
    row = something_or_other

値(または追加/拡張など)を直接割り当てて、それに応じrowlist変更を加えることができる場合もあれば、次のような回りくどいことをしなければならない場合もあります。

for row in list:
    list[list.index(row)] = something_or_other

何ができるの?!?

4

3 に答える 3

7

次のように、値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]])変更します。技術的には、これは再バインド操作と変更操作の違いです。

于 2012-09-03T15:52:39.433 に答える
1

rowforループ内は、元の名前にすぎません(ただし、forループ内で再割り当てすると、リンクが効果的に切断されます)。したがって、変更可能である場合は、基になるオブジェクトに反映されるメソッド(、、など)を使用できますappendaddextend

正しいイディオムは次のとおりです。

for rowno, row in enumerate(some_list):
    some_list[rowno] = #...
于 2012-09-03T15:55:37.403 に答える
1

に割り当てると、ではなくパフォーマンスが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
于 2012-09-03T15:52:13.047 に答える