9

此处与此回复相关。当地人的医生在这里。

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

4

5 回答 5

10

文档说的是,当你有一个局部x变量并且 dolocals()['x'] = 42时,thenx可能仍然指向旧对象。

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

foo()
于 2011-02-14T21:02:52.247 回答
6

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

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

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

于 2011-05-11T05:21:59.997 回答
4

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

于 2011-02-14T21:39:36.333 回答
3

潜入 Python

locals 是一个返回字典的函数,在这里您要在该字典中设置一个值。您可能认为这会将局部变量 x 的值更改为 2,但事实并非如此。locals 实际上并不返回本地命名空间,它返回一个副本。因此,更改它对本地命名空间中的变量值没有任何影响。

于 2011-02-14T21:02:50.700 回答
1

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

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

你不需要更多的理由。

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


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

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

于 2011-02-14T21:12:12.317 回答