Pythonでリストをループしている間、リストを理解しないと要素を変更できませんでした。参考のために:
li = ["spam", "eggs"]
for i in li:
i = "foo"
li
["spam", "eggs"]
li = ["foo" for i in li]
li
["foo", "foo"]
だから、なぜPythonでループを介して要素を変更できないのですか?間違いなく私が見逃しているものがありますが、私は何を知りません。これは重複していると確信していますが、これに関する質問は見つかりませんでした。リンクがあれば、それで十分です。前もって感謝します!
なぜならfor i in li
worksは次のようなものです。
for idx in range(len(li)):
i = li[idx]
i = 'foo'
したがって、i
に何かを割り当てても、li[idx]
。
解決策は、提案したものか、インデックスをループすることです。
for idx in range(len(li)):
li[idx] = 'foo'
またはenumerate
を使用します:
for idx, item in enumerate(li):
li[idx] = 'foo'
実際、リストの内包表記では、リストを変更するのではなく、新しいリストを作成してから、それを前のリストを含む変数に割り当てます。
とにかく、for i in li
変数li
内のi
の各値のコピーを取得していますが、li
内の位置への参照を取得していないため、何も変更していません。 li
の値。
リストを変更する場合は、enumerate
を使用して変更できます。
>>> li = ["spam", "eggs"]
>>> for i,_ in enumerate(li):
li[i] = "foo"
>>> li
['foo', 'foo']
またはxrange
(Python 2.7で、python 3)の範囲を使用:
>>> for i in xrange(len(li)):
li[i] = "foo"
>>> li
['foo', 'foo']
または、質問で示したリストの理解度を使用します。
辞書を使用すると役立つかもしれません。
>>> li = {0: "spam", 1:"eggs"}
for k, v in li.iteritems():
li[k] = "foo"
>>> li
{0: 'foo', 1: 'foo'}
ループ中にリストを変更できます:
lst = range(10) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, elem in enumerate(lst):
lst[i] = 0 // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for element in li
-要素自体ではなく、要素のコピーを返します。
あなたの場合の解決策は次のとおりです。
for i in range(len(li)):
li[i] = 'foo'