这里最重要的是变量名。它们真的只是字典的钥匙。它们在运行时解析,具体取决于当前作用域。
让我们看看您在代码中访问的名称。locals函数帮助我们:它显示本地作用域中的名称(及其值)。这是您的代码,带有一些调试输出:a = [1, 2, 3] # a is bound
print(locals())
for x in a: # a is read, and for each iteration x is bound
x = x + 3 # x is read, the value increased and then bound to x again
print(locals())
print(locals())
print(x)
(注意,我将x += 3扩展到x = x + 3,以增加名称访问(读和写)的可见性。)
首先,将列表[1, 2, 3]绑定到名称a。然后,遍历列表。在每次迭代期间,该值都绑定到当前作用域中的名称x。然后,赋值将另一个值赋给x。
这是输出{'a': [1, 2, 3]}
{'a': [1, 2, 3], 'x': 4}
{'a': [1, 2, 3], 'x': 5}
{'a': [1, 2, 3], 'x': 6}
{'a': [1, 2, 3], 'x': 6}
6
在任何时候,您都不能访问列表a,因此永远不会修改它。
为了解决您的问题,我将使用枚举函数获取索引和值,然后使用名称a访问列表来更改它。for idx, x in enumerate(a):
a[idx] = x + 3
print(a)
输出:[4, 5, 6]
注意,您可能希望将这些示例包装在函数中,以避免全局命名空间混乱。
有关作用域的详细信息,请阅读chapter in the Python tutorial。要进一步研究这个问题,请使用globals函数查看全局命名空间的名称。(不要与global关键字混淆,请注意缺少的“s”。)
玩得开心!