我需要更改有序字典的值。我使用了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
这可能是一些基本的编程原则,所以我对'为什么'感兴趣所以我不会犯这样的错误。谢谢!
答案 0 :(得分:6)
Python中的变量名是指向“指向”值的引用。在您尝试val = idx
之前,这是看起来的样子:
以下是它的样子:
如果您改为settings['Accel X Bias'] = idx
,则会得到:
答案 1 :(得分:5)
在循环中,name
和val
依次绑定到映射中的每个对象。只需重新绑定,名称就不会修改原始的可迭代内容。