为什么在python中修改locals是个坏主意?

hhh*_*hhh 5 python locals

与此相关的答复这里.当地人的文件在这里.

文档提到字典不应该改变,不确定它意味着什么但是locals()适用于数据不会改变的实验室报告,例如在测量中?

Cat*_*lus 7

文档说的是,当你有一个局部x变量并且这样做时locals()['x'] = 42,x仍然可以指向旧对象.

def foo():
    x = 0xABCD
    locals()['x'] = 42
    print(x)

foo()
Run Code Online (Sandbox Code Playgroud)

  • @PiMathCLanguage 因为你几乎可以肯定**不必这样做**。动态更改本地命名空间几乎从来没有一个好的用例,并且由于允许这样做会阻止 Python 3 中的优化(本地命名空间不再是“dict”,而是一个用于更快查找的数组),那么语言设计者认为这还不够重要,不能让你这样做 (3认同)

rsp*_*eed 6

在某些情况下,对 locals() 的调用返回从多个来源收集的值,而不是指向本地作用域的指针。

示例:在函数调用内部时,locals() 返回全局作用域和函数局部作用域的组合。在这种情况下,修改 locals() 输出不会对本地范围进行任何更改,因为它本质上是在使用一个岛。这似乎是它唯一的案件工作,这样的情况的输出是一样的全局变量()的输出。

因此,换句话说,您要么想使用 globals(),要么寻找不同的方法来实现相同的目标。


Fre*_*urk 0

修改是一个坏主意,因为文档(您链接的)明确表示不要:

注:本词典内容不得修改;更改可能不会影响解释器使用的局部变量和自由变量的值。

你不需要更多的理由。

如果您以不修改任何变量的方式使用它,那么您会没事的,但我会质疑设计并看看是否有更好的方法来完成您想要的事情。


在您链接的具体示例中,locals 实际上是 globals(),因为您在模块的全局范围内使用它。这种非常具体的用法现在可以工作,尽管我希望它继续像全局变量一样工作,但您也可以只使用全局变量。

一个更干净的解决方案可能是,在不知道设计的其余部分的情况下,为变量使用常规的字典;然后使用 data["x"] = value 而不是 globals()["x"] = value。

  • 当有人问“为什么文档说这是一个坏主意”时,回答“因为文档是这么说的”并不是一个有用或信息丰富的答案。 (19认同)
  • @GlennMaynard:他没有说“为什么文档这么说”,他问“为什么这是一个坏主意”。由于他无法更改行为和文档,因此来自文档的警告有“充足”的理由不修改值 - 特别是当有两个简单的解决方法(上面都提到过)时。 (4认同)