1

数値のリストがあり、forループを使用してそれらをインクリメントしたい場合、なぜこれが機能しないのですか?

>>> list=[1,2,3,4,5]
>>> for num in list: 
...  num=num+1
... 
>>> list
[1, 2, 3, 4, 5]

[2,3,4,5,6]を取得する予定でした。

私はこれを回避することができることを知っています

>>> newlist=[] 
>>> for num in list: 
...  newlist.append(num+1)
... 
>>> newlist
[2, 3, 4, 5, 6]
>>> 

しかし、もっと簡単な方法があるはずです。

4

3 に答える 3

4

これは、リスト内の変数への参照のみを取得するためです。それを置き換えるときは、その参照が指しているものを変更するだけなので、リスト内の項目は変更されません。これについての最良の説明は、視覚的にそれに従うことです-そのリンクにある実行の視覚化をステップスルーすると、それは非常に明確になるはずです。

変更可能なオブジェクトはその場で変更できることに注意してください。これはリストに影響します(オブジェクト自体が変更されるため、操作している名前が指しているものだけではありません)。比較のために、ここの視覚化を参照してください。

ここでの最良のオプションはリスト内包です。

new_list = [num + 1 for num in old_list]
于 2013-02-13T05:29:20.763 に答える
4

これは、Pythonでの割り当ての仕組みの成果物です。割り当てを行う場合:

name = something

オブジェクトsomething(右側を評価した結果)を取得nameし、ローカル名前空間の名前にバインドします。ループを実行するときは、forループ内の要素への参照を取得してから、古いオブジェクトに1を追加して新しいオブジェクトを作成します。次に、その新しいオブジェクトをnum現在の名前空間の名前に(何度も何度も)割り当てます。

元のリストのオブジェクトが変更可能である場合は、forループでオブジェクトを変更できます。

lst = [[],[],[]]
for sublst in lst:
    sublst.append(0)

そして、元のリストにこれらの変更が表示されます。ただし、ここでは割り当てを行っていないことに注意してください。

もちろん、lattywareが示唆しているように、リスト内包表記を使用して新しいリストを作成できます。

new_list = [x+1 for x in old_list]

そして、あなたはその場で割り当てを起こさせることさえできます:

old_list[:] = [x+1 for x in old_list]
于 2013-02-13T05:29:56.213 に答える
1

これは、配列にインデックスを付けることで実現できます。

>>> list=[1,2,3,4,5]
>>> for i in range(len(list)): 
...  list[i]=list[i]+1

これにより、Lattywareが説明した参照の問題を回避できます。

于 2013-02-13T05:31:39.520 に答える