web-dev-qa-db-ja.com

ループ内のリスト要素を変更することはできませんPython

Pythonでリストをループしている間、リストを理解しないと要素を変更できませんでした。参考のために:

li = ["spam", "eggs"]
for i in li:
    i = "foo"

li
["spam", "eggs"]

li = ["foo" for i in li]
li 
["foo", "foo"]

だから、なぜPythonでループを介して要素を変更できないのですか?間違いなく私が見逃しているものがありますが、私は何を知りません。これは重複していると確信していますが、これに関する質問は見つかりませんでした。リンクがあれば、それで十分です。前もって感謝します!

29
user2717129

なぜなら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'
31
justhalf

実際、リストの内包表記では、リストを変更するのではなく、新しいリストを作成してから、それを前のリストを含む変数に割り当てます。

とにかく、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']

または、質問で示したリストの理解度を使用します。

8
jabaldonedo

辞書を使用すると役立つかもしれません。

>>> li = {0: "spam", 1:"eggs"}
    for k, v in li.iteritems():
        li[k] = "foo"

>>> li
{0: 'foo', 1: 'foo'}
1
grasshopper

ループ中にリストを変更できます:

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]
1
user278064

for element in li-要素自体ではなく、要素のコピーを返します。

あなたの場合の解決策は次のとおりです。

for i in range(len(li)):
    li[i] = 'foo'
0
alandarev