3

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

因此,我遍历具有所需名称的元组,并通过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 只包含正常的函数变量吗?为什么它不起作用?

4

2 回答 2

1

当你写:

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

你修改locals()字典:

正如@user2357112恰当地链接在文档中

笔记

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

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

于 2015-12-28T21:50:30.380 回答
1

引用这篇文章,解释似乎是在函数内部,您只是检索命名空间的副本,而不是命名空间本身:

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

我仍在寻找一种方法来更改函数内的命名空间,所以我希望看到有人用比这更好的解决方案来回答这个问题。

于 2016-12-08T21:12:30.463 回答