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

时间:2011-02-14 20:58:02

标签: python locals

与此回复here相关。当地人的文档here.

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

5 个答案:

答案 0 :(得分:7)

说明的是,当您拥有本地x变量且执行locals()['x'] = 42时,x仍可能指向旧对象。

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

foo()

答案 1 :(得分:4)

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

示例:在函数调用内部,locals()返回全局范围和函数本地范围的组合。在这种情况下,修改locals()输出将不会对本地范围进行任何更改,因为它实际上使用的是岛。似乎 工作的唯一情况是其输出与globals()的输出相同。

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

答案 2 :(得分:3)

在CPython解释器中,局部变量可以来自许多地方(其中的细节并不重要,但它与如何为闭包存储变量有关)。 locals()函数从所有这些位置收集名称和值,以便在一个地方方便地访问它们,但由于它不知道给定变量的来源,因此它无法放置它背部。换句话说,这是一个坏主意,因为它不起作用。

答案 3 :(得分:2)

来自Dive into Python

  

locals是一个返回a的函数   字典,在这里你正在设置一个   那个字典里的价值。你可能会   认为这会改变价值   局部变量x到2,但它   没有。当地人实际上并没有   返回本地命名空间,它返回   复印件。所以改变它没有任何意义   中的变量值   本地命名空间。

答案 4 :(得分:0)

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

  

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

您不需要更多理由。

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


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

更清晰的解决方案可能是在不知道你的其他设计的情况下,为你的变量使用常规的ol'字典;然后使用data [“x”] = value而不是globals()[“x”] = value。