dic = {'a':'1','b':'2'}
lis = ['a','b']
for c in lis:
c = dic[c]
print lis
リストは変更されていません。リストが に変更されると予想していました['1','2']。誰でも説明できますか?
dic = {'a':'1','b':'2'}
lis = ['a','b']
for c in lis:
c = dic[c]
print lis
リストは変更されていません。リストが に変更されると予想していました['1','2']。誰でも説明できますか?
いいえ、それはリストの反復がどのように機能するかではありません。cは反復ごとに新しいオブジェクトであり、そのオブジェクトを変更しても、元のリストは (ありがたいことに!) 変更されません。
それが必要な場合は、次を使用しますenumerate()。
dic = {'a':'1','b':'2'}
lis = ['a','b']
for i, c in enumerate(lis):
lis[i] = dic[c]
print lis
繰り返しで欠けている最も重要なことは、要素を name に割り当てるcと、新しいオブジェクトにc=dic[c]再バインドされ、元のオブジェクトが更新されないという事実です。c次のデモを検討してください
>>> for i, c in enumerate(lst):
print id(c), id(lst[i]),
c=dic[c]
print id(c)
4935168 4935168 4934712
4935192 4935192 5496728
したがって、割り当ての前にリスト要素とリストc内の同じオブジェクトを参照しますが、辞書の値を割り当てると参照が変更されるだけです
ここidでは、参照オブジェクトの識別子を参照するだけであることに注意してください
リスト全体を変更しているので、リスト内包表記を使用する方が簡単で速いことに注意してください
lst = [dic[e] for e in lst]
['1', '2']
警告組み込み関数に変数名を付けないでください
変数の代わりにインデックスを使用してみてください...
for i in range(len(li)):
c = li[i]
li[i] = dic[c]
print li
また、list変数名として使用しないでください..
またはenumeratelikeを使用してください
for i, c in enumerate(li):
li[i] = dic[c]
print li
またはリスト内包表記
lis = [dic[c] if c in dic else c for c in lis]
なぜあなたは何をしていないのですか?
を使用するとfor x in y:、xのオブジェクト/アイテムの値が取得されます。y
したがって、 の値を変更しても、現在のインデックスである のx値は変更されません。y[i]i
だから、こうすれば
>>> y = range(5,10)
>>> for x in y:
i = y.index(x)
x += 10
print i
print 'Value of x : %3d, id: %7d' % (x, id(x))
print 'Value of y[i] : %3d, id: %7d' % (y[i], id(y[i]))
print '-'*31
違いがわかります
あなたがするとき
for c in myList:
c = something
c名前を「何か」、この場合は at の値に再バインドしていますdic[c]。Python を実際にリストに「到達」させるには、そのリストのメソッドを呼び出す必要があります。このメソッドは、単純な変数割り当てを行うのではなくlist.__setitem__()、実際のリスト オブジェクトにアクセスし、そのリスト内の項目を変更するように Python に指示します。 .
for i, c in enumerate(myList):
myList.__setitem__(dic[c])
もちろん、これは次のように書くこともできます(よりpythonic):
for i, c in enumerate(myList):
myList[i] = dic[c]
変数の割り当てのように見えますが、そうではありません。