1

我需要更改有序字典的值。我使用了一个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

于 2013-08-30T04:54:46.510 回答