1

Ordered Dictionary の値を変更する必要があります。ループを使用しましたforが、値は変化しませんでした。[]これは、ブラケット表記を使用して直接ではなく、ループ内の変数名に割り当てていたためであることがわかりました。ループ変数名でループ内の値を参照できないのはなぜですか?

試した:

idx = 0
for name,val in settings.items():
    idx += 1
    val = idx
    print name,val

結果:OrderedDict([('Accel X Bias', None), ('Mag X Bias', None)])

期待される:OrderedDict([('Accel X Bias', 1), ('Mag X Bias', 2)])

完全なコード:

import collections
settings = collections.OrderedDict([('Accel X Bias', None), ('Mag X Bias', None)])
idx = 0

print "\nIn loop, values are changed:"
for name,val in settings.items():
    idx += 1
    val = idx
    print name,val

print "\nAfter Loop, values didn't change:\n",settings

for name,val in settings.items():
    idx += 1
    val = idx
    settings[name] = idx
print "\nAfter Loop, bracket notation used, values changed successfully:\n",settings

これはおそらく基本的なプログラミングの原則なので、「なぜ」に興味があるので、このような間違いをこれ以上犯さないようにしています。ありがとう!

4

2 に答える 2

6

Python の変数名は、値を「指す」参照です。試す前の様子は次のval = idxとおりです。

ここに画像の説明を入力

そして、次のようになります。

ここに画像の説明を入力

代わりにそうsettings['Accel X Bias'] = idxすると、次のようになります。

ここに画像の説明を入力

于 2013-08-30T05:06:43.470 に答える
5

ループ内nameで、マッピング内の各オブジェクトに順番にバインドされvalます名前を再バインドするだけでは、元の iterable は変更されません。

于 2013-08-30T04:54:46.510 に答える