37

While looping over a list in Python, I was unable to modify the elements without a list comprehension. For reference:

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

li
["spam", "eggs"]

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

So, why can't I modify elements through a loop in Python? There's definitely something I'm missing, but I don't know what. I'm sure this is a duplicate, but I couldn't find a question about this, and if there is a link, that would be more than enough.

4

5 に答える 5

48

仕組みfor i in liは次のようなものです。

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'
于 2013-10-10T08:34:04.803 に答える
14

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

とにかく、variablefor i in liの各値のコピーを取得しているときは、 の位置への参照を取得していないため、 の値を変更していません。liilili

リストを変更したい場合は、次の方法で実行できますenumerate

>>> li = ["spam", "eggs"]
>>> for i,_ in enumerate(li):
        li[i] = "foo"
>>> li
 ['foo', 'foo']

またはxrange(Python 2.7 では、Python 3 で range を使用します):

>>> for i in xrange(len(li)):
        li[i] = "foo"
>>> li 
 ['foo', 'foo']

または、質問で示したリスト内包表記を使用します。

于 2013-10-10T08:34:58.197 に答える
1

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

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]
于 2013-10-10T08:34:59.457 に答える
0

辞書を使うと便利かもしれません。

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

>>> li
{0: 'foo', 1: 'foo'}
于 2013-10-10T09:00:41.797 に答える