文档提到字典不应该改变,不确定它是什么意思,但locals()
适用于数据不会改变的实验室报告,例如测量?
5 回答
文档说的是,当你有一个局部x
变量并且 dolocals()['x'] = 42
时,thenx
可能仍然指向旧对象。
def foo():
x = 0xABCD
locals()['x'] = 42
print(x)
foo()
在某些情况下,对 locals() 的调用返回从多个来源收集的值,而不是指向本地范围的指针。
示例:在函数调用中,locals() 返回全局范围和函数本地范围的组合。在这种情况下,修改 locals() 输出不会对本地范围进行任何更改,因为它本质上是在使用一个岛。似乎它确实起作用的唯一情况是其输出与 globals() 的输出相同的情况。
因此,换句话说,您要么想使用 globals(),要么找到不同的方法来实现相同的目标。
在 CPython 解释器中,局部变量可以来自很多地方(这点的细节并不重要,但它与如何为闭包存储变量有关)。该locals()
函数从所有这些地方收集名称和值,以便您在一个地方方便地访问它们,但由于它不知道给定变量的来源,它不能把它放回去。换句话说,这是一个坏主意,因为它不起作用。
locals 是一个返回字典的函数,在这里您要在该字典中设置一个值。您可能认为这会将局部变量 x 的值更改为 2,但事实并非如此。locals 实际上并不返回本地命名空间,它返回一个副本。因此,更改它对本地命名空间中的变量值没有任何影响。
修改是一个坏主意,因为文档(您链接的)明确表示不要:
注意:不得修改本词典的内容;更改可能不会影响解释器使用的局部变量和自由变量的值。
你不需要更多的理由。
如果您以不修改任何变量的方式使用它,那么您会没事的,但我会质疑设计,看看是否有更好的方法来做您想做的事。
在您链接的特定示例中,locals 实际上是 globals(),因为您在模块的全局范围内使用它。这种非常具体的用法现在有效,尽管我希望它继续像使用全局变量一样工作,但您也可以只使用全局变量。
一个更干净的解决方案可能是,在不了解您设计的其余部分的情况下,为您的变量使用常规的 ol' 字典;然后使用 data["x"] = value 而不是 globals()["x"] = value。