为什么在Python中修改局部变量是个坏主意?

11 投票
5 回答
3601 浏览
提问于 2025-04-16 11:49

与这个回复有关 这里。本地变量的文档 在这里。

文档提到字典不应该改变,这是什么意思我不太明白。不过,locals() 适用于实验报告吗?比如说在测量数据不会改变的情况下?

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。

撰写回答