为什么在Python中修改局部变量是个坏主意?
5 个回答
6
在某些情况下,调用 locals() 函数返回的值是从多个地方收集来的,而不是指向本地作用域的指针。
举个例子:当你在一个函数内部时,locals() 返回的是全局作用域和函数本地作用域的结合。在这种情况下,修改 locals() 的输出不会对本地作用域产生任何影响,因为它实际上就像是使用了一个孤岛。看起来,只有在它的输出和 globals() 的输出相同的情况下,它才会有效。
换句话说,你要么使用 globals(),要么找其他方法来达到同样的目的。
11
文档中说的是,当你有一个本地变量 x
,然后执行 locals()['x'] = 42
这行代码时,x
可能还是指向之前的那个对象。
def foo():
x = 0xABCD
locals()['x'] = 42
print(x)
foo()
0
修改这个东西并不是个好主意,因为你链接的文档里明确说了不可以这么做:
注意:这个字典的内容不应该被修改;修改可能不会影响解释器使用的局部和自由变量的值。
光这一点就足够了。
如果你用它的方式没有修改任何变量,那就没问题,但我会怀疑这个设计,看看有没有更好的方法来实现你的需求。
在你提到的具体例子中,locals 实际上就是 globals(),因为你是在模块的全局范围内使用它。这个特定的用法现在是有效的,虽然我预计它会继续有效,就像 globals 一样,但你不如直接使用 globals。
一个更简单的解决方案,虽然我不知道你设计的其他部分,可能是用一个普通的字典来存储你的变量;然后用 data["x"] = value 来代替 globals()["x"] = value。