如何从另一个函数直接访问局部变量?

9 投票
5 回答
12089 浏览
提问于 2025-04-15 13:36

假设我有这个:


def a(dict):
  locals().update(dict)
  print size

def b():
  size = 20
  f(locals())

我想知道怎么才能直接从 a 函数里访问 size 这个变量?我知道可以这样做:


size = dict["size"]

但是我觉得应该有更直接的方法。我试过用 locals().update(dict),但没成功。有没有更好的办法?

5 个回答

1

这对你有帮助吗?

def print_size(size=None):
    print(size)

dict = {'size': 'XXL'}
print_size(**dict)
2

你可以用闭包来访问另一个函数的作用域:

def b():

  def a():
    print size

  size = 20
  a()

这里的关键是把相关的函数一个套一个地放在一起。这样,里面的函数a就可以访问外面函数b的局部变量。

不过我不知道你具体想做什么,所以不确定这是否对你有帮助。

24

Python 编译器在处理本地变量时会进行优化,它会在编译时判断一个函数访问的变量名是否是本地的(也就是说,这些变量是在函数内部被赋值或绑定的)。所以,如果你写了:

def lv1(d):
  locals().update(d)
  print zap

编译器“知道”变量 zap 不是本地变量(因为在函数 lv1 中没有被赋值),因此它会把访问这个变量的代码编译成全局访问——无论 d 里有什么都没关系。

如果你喜欢慢吞吞且臃肿的代码,你可以通过在函数内部使用 exec 来阻止这种优化——当编译器看到 exec 这个关键词时,它“知道”你想让代码尽可能慢、臃肿和出错,因此它就不会进行任何优化,几乎是这样。

所以,下面的代码会按照你的期望工作:

def lv1(d):
  exec ""
  locals().update(d)
  print zap

lv1({'zap': 23})

它会输出 23,正如你想要的那样。

我希望从上面的“冷幽默”中你能明白,这种技巧并不推荐,但我还是要非常明确地说:为了写 print zap 而不是 print locals()['zap'] 这种可疑的语法乐趣,你确实要付出性能上的高昂代价。不过,就像所有一些危险的工具一样,它们在一些罕见的情况下对真正有经验的高手来说可能有用,exec 这个功能是可以让你随意使用(或滥用)的:Python 不会阻止你!-)

撰写回答