3

リストの変更に関して、これら2つのPython操作の違いについて、誰かが簡潔な説明を提供してもらえますか?

demo = ["a", "b", "c"]

for d in demo:
    d = ""

print demo
#output: ['a', 'b', 'c']

for c in range(len(demo)):
    demo[c] = ""

print demo
#output: ['', '', '']

言い換えれば、最初の反復でリストが変更されないのはなぜでしょうか? ありがとう!

4

3 に答える 3

5

ループ変数dは、常に反復可能なオブジェクトの要素への参照です。質問は、いつまたはいつ参照されないかという問題ではありません。ループで実行している代入操作についてです。

最初の例では、空の文字列への別の参照を使用して、オブジェクト内の要素の元の参照を再バインドしています。これは、 valueに対して実際には何もしないことを意味します。シンボルに新しい参照を割り当てるだけです。

2 番目の例では、インデックス作成操作を実行し、そのインデックスの値に新しい参照を割り当てています。demo同じ参照のままで、コンテナ内の値を置き換えています。
割り当ては、実際には次と同等です。demo.__setitem__(c, "")

a = 'foo'
id(a)  # 4313267976
a = 'bar'
id(a)  # 4313268016

l = ['foo']
id(l)  # 4328132552
l[0] = 'bar'
id(l)  # 4328132552

最初の例で、オブジェクト ID がどのように変更されたかに注意してください。新しいオブジェクトへの参照です。2 番目の例では、リストにインデックスを付けてコンテナー内の値を置き換えますが、リストは同じオブジェクトのままです。

于 2013-01-01T19:58:51.513 に答える
4

最初の例では、変数dはリスト内の要素のコピーと考えることができます。を行うときd = ""は、基本的にリスト内にあるもののコピーを変更しているので、当然リストは変更されません。

2番目の例では、リスト内の要素を実行range(len(demo))してインデックスを作成することにより、リスト内の要素に直接アクセスして変更することができます。したがって、実行demo[c]するとリストが変更されます。

ループ内からPythonリストを直接変更する場合は、リストをコピーして操作するか、できればリスト内包表記を使用します。

それで:

>>> demo = ["a", "b", "c"]
>>> test = ["" for item in demo]
>>> print test
["", "", ""]

>>> demo2 = [1, 5, 2, 4]
>>> test = [item for item in demo if item > 3]
>>> print test
[5, 4]
于 2013-01-01T19:52:07.793 に答える
1

あなたがそうするとき、あなたはd = <something>変数dを参照させています<something>dこのように、あたかも のように使用できます<something>。ただし、 を指定した場合d = <something else>dは を指し、<something else>ではなくなります<something>(=符号は代入演算子として使用されます)。の場合は、リスト内の項目にdemo[c] = <something else>割り当て<something else>ています。(c+1)th

ただし、d呼び出したい自己変更メソッドがアイテムにある場合は、次のことができます。

for d in demo:
    d.<some method>()

リストdemoにはこれらのオブジェクト (またはオブジェクトへの参照、覚えていません) が含まれているため、それらのオブジェクトが変更されると、リストも変更されます。

于 2013-01-01T20:18:21.297 に答える