在调用带有变量名称作为参数的函数时,我需要分配一些变量。
因此,我循环使用所需名称的元组,通过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只包含正常的函数变量吗?为什么它不起作用?
答案 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实际上并不返回本地命名空间,而是返回一个副本。因此,更改它不会对本地命名空间中的变量值产生任何影响。
我仍然在寻找一种方法来改变函数中的命名空间,所以我很乐意看到有人用更好的解决方案回答这个问题。