写给当地人()的作品与其说不是文档相反
我目前正在修改变量作用域以及如何修改/复制它们,因为我想在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我:)
你在哪里读书呢?无论Py 2 docs和Py 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有没有这样的纸条,然而。
起初:非常感谢!我已添加链接到文档。我将停止修改locals(),但有没有一种你知道的方法,将一个函数的所有局部变量复制到另一个包含在通过IPython动态导入的模块中的函数?我想避免复制到导入模块中的globals()。你可能知道任何方式,以便我可以修改局部变量? – sh4kesbeer
@ sh4kesbeer而不是像这样修改变量,只需将值保存在实际的字典中。这样,你可以返回字典。如果没有像这样重新设计它,真的没有办法做到这一点,因为动态变量并不意味着分配给它。 – Artyer
mhh好的,谢谢!我希望能够建立某种处理流水线,在那里我会复制本地的“工作空间”,但似乎这并没有转化为python。我会尝试习惯字典表示法,然后 – sh4kesbeer
在模块范围,locals()
返回可修改的全局模块字典。当地人在功能上是不同的。在这里,变量没有改变。正如其他地方所提到的,这完全取决于实现。你不能依靠locals()
作为一名作家。
>>> def foo():
... x = 2
... locals()['x'] = 3
... print(x)
...
>>>
>>> foo()
2
Integertingly,用print(locals()['x'])代替'print(x)''仍然会打印2,但是将'global x'添加到函数使'print(x)'print 2和'print(locals()['x'])'print 3。 – Artyer
你是'本地人'是'globals',因此写作是可能的。 – Daniel
这被看作是'vars()是locals()是globals()'''True''。该说明看起来像是文档错误。 – Artyer