6

Pythonで次のコードを試しましたが、これが得られたものです。elemを変更して反復可能オブジェクトに加えようとする多くの変更では、機能しないようです。

lis = [1,2,3,4,5]
for elem in lis:
    elem = 3

print lis
[1, 2, 3, 4, 5]

ただし、イテラブルが独自のメソッド(リストなど)を持つオブジェクトである場合は、forループで変更できます。

lis = [[1],[2]]
for elem in lis:
    elem.append(8)

print lis
    [[1, 8], [2, 8]]

ループでforは、「elem」という用語は正確には何ですか?前もって感謝します!

4

6 に答える 6

9

これが機能しない理由は、あなたが何でelem あるかを誤解しているためです。それはオブジェクト自体ではなく、「変数」と呼ぶのも正しくありません。

これは、オブジェクトを指す名前であり、ラベルのようなものです。直接割り当てるだけの場合は、名前を上書きして別の名前を指すようにします。ただし、リストへの元の参照はまだ残っているため、別の値を割り当ててもそれ自体elemは変更されませんlis

さて、この場合、elem指すオブジェクトはすべて整数であるため、それらをまったく変更することさえできません-整数(および文字列やタプルなどの他の多くのタイプ)は不変であるためです。つまり、簡単に言えば、オブジェクトが作成されると、それを変更することはできません。それらが「メソッドを持っている」かどうか(すべてのPythonオブジェクトにはメソッドがあり、整数が含まれている)とは関係ありませんが、不変であるかどうかとは関係ありません。

ただし、一部のオブジェクトは変更可能です。つまり、変更することができます。リストはそのようなオブジェクトの例です。2番目の例では、は、内に含まれるリストオブジェクトelemを参照する名前であり、それ自体は変更可能です。そのため、それらをインプレースで変更する(、、、などを使用)と正常に機能します。lis.append().remove()

于 2012-08-02T20:54:18.107 に答える
5

ループ内のelem変数は、各反復での現在のオブジェクトへの参照です。for変更しても何も起こりません。変数の値を変更するだけでelem、次回はループを介して変更されます。リスト内の要素の値を実際に変更するには、リストへの参照と変更する要素のインデックスが必要ですが、後者はありません。

だからあなたがしたいことはこのようなものです:

for index, elem in enumerate(lis):
    lis[index] = 3

このようにしてelem、要素の値とindexリスト内の位置を取得できます。lis[index]値を取得するために絶えず書き込む必要がなくなりますが、要素を変更するにはそれを行う必要があります。

次のこともできます。

for index in xrange(len(lis)):
    lis[index] = 3

ただし、ほとんどの場合、これは非Pythonicと見なされます(特に、リストが繰り返されている間にリストが長くなったり短くなったりするとどうなりますか)。

于 2012-08-02T20:54:33.693 に答える
3

名前に新しい値を割り当てるときは、ループelem内のローカルバインディングを変更するだけです。forに格納されている値を変更する場合は、次のように、またはリスト内包表記lisを使用します。map

lis = [3 for elem in lis]

ただし、他の値と同じように、の属性を変更するelem(または変更するメソッドを呼び出す)ことができます。

于 2012-08-02T20:52:39.433 に答える
3

ここでは、2番目の例で実際にリストオブジェクトを変更しています。最初の例では、番号を変更するのではなく、番号を置き換えます。これは、Pythonの新規ユーザーにとって複雑なニュアンスになる可能性があります。

これをチェックしてください:

>>> x = 1
>>> id(x)
4351668456
>>> x = 2
>>> id(x)
4351668432

idオブジェクトの識別子を返します。上記のように、オブジェクトはxこれらの両方の時間で変化します。

>>> y = [1]
>>> id(y)
4353094216
>>> y.append(2)
>>> id(y)
4353094216

ここでは、リストを変更して、リストが元のオブジェクトのままになるようにしますy

つまり、これはすべて、実行しているときにelem = 3、それを変更するのではなく、置き換えることを意味します。そして今では、それはもうリストに関連付けられていません。

これは、あなたがやろうとしていることを行うことができる方法の1つです。これにより、インデックスが取得され、番号ではなくリストが変更されます。

lis = [1,2,3,4,5]
for idx, elem in enumerate(lis):
    lis[idx] = 3

print lis
[1, 2, 3, 4, 5]
于 2012-08-02T20:55:35.253 に答える
1

最初の例では、整数を変更しようとしていますが、それは不変です(文字列のように)。

Python変数は、オブジェクトを指すラベルと見なす必要があります。不変のリストを反復処理する場合、リストelem内のその位置ではなく、不変のオブジェクトを指すため、元のリストを変更することはできません。

2番目のケースでは、elem変更可能なオブジェクトをポイントして、元のリストが変更されていることを確認します。

于 2012-08-02T21:00:34.623 に答える
0

それはelemのtype()が何であるかに依存します。

最初のケースでは、各elemはintオブジェクトであり、それを変更するために機能します。elem = 3リスト自体の項目ではなく、次のように言うと、一時オブジェクトを変更します。

2番目のケースでは、各要素はリストオブジェクトです。

于 2012-08-02T20:54:10.387 に答える