写给当地人()的作品与其说不是文档相反

问题描述:

我目前正在修改变量作用域以及如何修改/复制它们,因为我想在IPython中动态地后处理一些结果。 关于locals(),vars()和globals()的混淆现在对我来说是真实的。 特别是因为这段代码的输出:写给当地人()的作品与其说不是文档相反

Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> locals()["test"] = 5 
>>> print(test) 
5 

按照以上简短的文件在我的理解这应该是不可能的:

注意,当地人字典仅用于读取有用因为更新 当地人字典被忽略。

(这是什么原因在瓦尔的description()函数说明)

我希望有人能ENLIGHT我:)

+3

你是'本地人'是'globals',因此写作是可能的。 – Daniel

+0

这被看作是'vars()是locals()是globals()'''True''。该说明看起来像是文档错误。 – Artyer

你在哪里读书呢?无论Py 2 docsPy 3 docs有以下免责声明:

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

这正好显示了这是什么:一个实现细节。当然,它可以在CPython中使用,但它可能不适用于IronPython和Jython等其他解释器。这就是所谓的黑客攻击。

不要依赖它来更新任何变量。甚至不要试图做任何严肃的事情,因为它会导致不确定的行为。

在CPython的3.6.0,help(locals)有以下注意事项:

NOTE: Whether or not updates to this dictionary will affect name lookups in 
the local scope and vice-versa is *implementation dependent* and not 
covered by any backwards compatibility guarantees. 

CPython的2.7.13有没有这样的纸条,然而。

+0

起初:非常感谢!我已添加链接到文档。我将停止修改locals(),但有没有一种你知道的方法,将一个函数的所有局部变量复制到另一个包含在通过IPython动态导入的模块中的函数?我想避免复制到导入模块中的globals()。你可能知道任何方式,以便我可以修改局部变量? – sh4kesbeer

+0

@ sh4kesbeer而不是像这样修改变量,只需将值保存在实际的字典中。这样,你可以返回字典。如果没有像这样重新设计它,真的没有办法做到这一点,因为动态变量并不意味着分配给它。 – Artyer

+0

mhh好的,谢谢!我希望能够建立某种处理流水线,在那里我会复制本地的“工作空间”,但似乎这并没有转化为python。我会尝试习惯字典表示法,然后 – sh4kesbeer

在模块范围,locals()返回可修改的全局模块字典。当地人在功能上是不同的。在这里,变量没有改变。正如其他地方所提到的,这完全取决于实现。你不能依靠locals()作为一名作家。

>>> def foo(): 
...  x = 2 
...  locals()['x'] = 3 
...  print(x) 
... 
>>> 
>>> foo() 
2 
+0

Integertingly,用print(locals()['x'])代替'print(x)''仍然会打印2,但是将'global x'添加到函数使'print(x)'print 2和'print(locals()['x'])'print 3。 – Artyer