在Python中如何添加到本地命名空间?

4 投票
2 回答
5235 浏览
提问于 2025-04-15 14:59

在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只是一个函数,不再是语句或关键字)——编译器现在会无条件地进行局部变量优化,所以再也没有办法绕过这个限制,让这种“黑科技”继续有效。

撰写回答