无法通过更改函数内的locals()来创建变量

时间:2015-12-28 20:53:47

标签: python locals

在调用带有变量名称作为参数的函数时,我需要分配一些变量。

因此,我循环使用所需名称的元组,通过locals() dict分配它们。

它有效,但是我无法通过名称访问它们 - 甚至在函数本身内部。

def function():
    var_names = ("foo","bar","foobar")
    for var_name in var_names:
        locals()[var_name] = len(var_name)
    print foo

抛出:

Traceback (most recent call last):
  File "error_test.py", line 8, in <module>
    function()
  File "error_test.py", line 5, in function
    print foo
NameError: global name 'foo' is not defined

使用以下代码可以很好地运行:

def function():
    var_names = ("foo","bar","foobar")
    for var_name in var_names:
        locals()[var_name] = len(var_name)
    print locals()["foo"]

不是locals() dict只包含正常的函数变量吗?为什么它不起作用?

2 个答案:

答案 0 :(得分:0)

当你写:

for var_name in var_names:
    locals()[var_name] = len(var_name)

您修改locals()字典:

as @ user2357112 aptly linked in the docs

  

请注意

     

不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。

因此修改locals()会删除局部变量,从而导致NameError: global name 'foo' is not defined错误。

答案 1 :(得分:0)

引用this post,解释似乎是在函数中只检索命名空间的副本而不是命名空间本身:

  

locals实际上并不返回本地命名空间,而是返回一个副本。因此,更改它不会对本地命名空间中的变量值产生任何影响。

我仍然在寻找一种方法来改变函数中的命名空间,所以我很乐意看到有人用更好的解决方案回答这个问题。