有什么方法可以修改本地字典吗?

locals是一个内置函数,该函数返回本地值的字典。该文件说:


警告


该字典的内容不得修改;更改可能不会影响解释器使用的局部变量的值。


不幸的是,exec在Python 3.0中也有同样的问题。有什么办法解决吗?


用例


考虑:


@depends("a", "b", "c", "d", "e", "f")

def test():

    put_into_locals(test.dependencies)

Depends将其参数中提供的字符串存储在列表中test.dependences。这些字符串是字典中的键d。我希望能够进行编写,put_into_locals以便我们可以将这些值提取出来d并放入当地人手中。这可能吗?


白衣染霜花
浏览 463回答 3
3回答

有只小跳蛙

局部变量由赋值语句修改。如果您使用的字典关键字是字符串,请不要也将它们设置为局部变量-只需将它们用作字典关键字即可。如果您绝对必须 具有局部变量,请执行此操作。def aFunction( a, b, c, d, e, f ):    # use a, b, c, d, e and f as local variablesaFunction( **someDictWithKeys_a_b_c_d_e_f )这将在您的字典中填充一些局部变量,而不会做任何神奇的事情。

心有法竹

这是不可能的。我认为这是为了以后可以进行性能优化。Python字节码通过索引而不是名称来引用本地。如果要求locals()是可写的,则它可能阻止解释器实现某些优化,或者使它们更加困难。我相当确定您不会找到任何保证您可以像这样编辑本地语言的核心API,因为如果该API可以做到,那么locals()也将没有此限制。不要忘记所有本地人都必须在编译时存在。如果您引用的名称在编译时未绑定到本地,则编译器会认为它是全局名称。编译后无法“创建”本地人。请参阅此问题以寻求一种可能的解决方案,但这是一个严重的问题,您确实不想这样做。请注意,示例代码存在一个基本问题:@depends("a", "b", "c", "d", "e", "f")def test():    put_into_locals(test.dependencies)"test.dependencies"不是指“ f.dependencies”,其中f是当前函数;它引用的是实际的全局值“ test”。这意味着如果您使用多个装饰器:@memoize@depends("a", "b", "c", "d", "e", "f")def test():    put_into_locals(test.dependencies)它不再起作用,因为“测试”是备忘录的包装函数,而不是依赖函数。Python 确实需要一种方法来引用“当前执行的函数”(和类)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python