答案 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)
locals是一个返回a的函数 字典,在这里你正在设置一个 那个字典里的价值。你可能会 认为这会改变价值 局部变量x到2,但它 没有。当地人实际上并没有 返回本地命名空间,它返回 复印件。所以改变它没有任何意义 中的变量值 本地命名空间。
答案 4 :(得分:0)
修改是一个坏主意,因为文档(您链接的)明确地说不:
注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
您不需要更多理由。
如果你以不修改任何变量的方式使用它,那么你会没事的,但我会质疑设计,看看是否有更好的方法来做你想做的事。
在您链接的特定示例中,locals实际上是globals(),因为您在模块的全局范围中使用它。这个非常具体的用法现在可以使用,虽然我希望它继续像全局变量一样工作,但你也可以使用全局变量。
更清晰的解决方案可能是在不知道你的其他设计的情况下,为你的变量使用常规的ol'字典;然后使用data [“x”] = value而不是globals()[“x”] = value。