在Python中如何添加到本地命名空间?
在Python中,有没有办法通过调用一个函数来往本地命名空间里添加内容,而不需要明确地在函数内部给变量赋值呢?
比如说,像下面这样做(当然,这样做是行不通的,因为locals()返回的是本地命名空间的一个副本),假设打印语句会输出'1'。
def A():
B(locals())
print x
def B(d):
d['x'] = 1
2 个回答
1
依赖像 exec ''
这样的黑科技看起来真不太好。那么用全局声明来进行沟通怎么样呢?这似乎是可行的:
>>> def outer():
... global x
... b()
... print x
...
>>> def b():
... global x
... x = 2
...
>>> outer()
2
你也可以为你的变量创建一个命名空间:
class Namespace(object):
pass
def A():
names = Namespace()
B(names)
print names.x
def B(d):
d.x = 1
然后可以用 names.x
或者 getattr(names, "x")
来访问这些属性。
4
在Python 2.*
中,你可以通过在函数开头加上 exec ''
来关闭Python编译器对局部变量访问的正常优化。这会让你的函数运行得非常慢(我今天早些时候刚发过一个回答,说明了局部变量优化是如何轻松让代码速度提高3到4倍的),但这样做可以让你想要的“黑科技”生效。也就是说,在Python 2.*中:
def A():
exec ''
B(locals())
print x
def B(d):
d['x'] = 1
A()
会输出 1
,正如你所希望的那样。
不过,这个“黑科技”在Python 3.*
中被禁用了(在这个版本中,exec
只是一个函数,不再是语句或关键字)——编译器现在会无条件地进行局部变量优化,所以再也没有办法绕过这个限制,让这种“黑科技”继续有效。