如何传递我的本地人并直接从另一个函数访问变量?

Geo*_*Geo 5 python variables language-features function

假设我有这个:


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

def b():
  size = 20
  f(locals())
Run Code Online (Sandbox Code Playgroud)

如何size直接从a函数中访问变量我该怎么办?我知道 :


size = dict["size"]
Run Code Online (Sandbox Code Playgroud)

但我认为应该有更直接的方式.我尝试使用locals().update(dict)但它没有用.有更好的方式吗?

Ale*_*lli 19

Python编译器通过在编译时识别函数正在访问的裸名是否是本地的(即,在函数内分配或以其他方式绑定的裸名)来优化对局部变量的访问.所以如果你编码:

def lv1(d):
  locals().update(d)
  print zap
Run Code Online (Sandbox Code Playgroud)

编译器"知道"裸zap名称不是本地的(未在函数中分配lv1),因此编译代码以将其作为全局访问 - 任何d包含都无关紧要.

如果你更喜欢缓慢而臃肿的代码,你可以通过使用exec函数内部来打败优化- 当编译器看到关键字时exec,它知道你正在尝试使代码尽可能缓慢,膨胀和错误,所以它通过不以任何方式进行优化来合作,仅仅是.

因此,以下代码可以按您的方式工作:

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

lv1({'zap': 23})
Run Code Online (Sandbox Code Playgroud)

23可以随心所欲地发出.

我希望从上面的"面无表情的幽默"中可以清楚地看出这种技术并不是值得推荐的,但我最好非常明确地说出来:因为print zap代替print locals()['zap']你写作的可疑语法乐趣,你在性能方面付出了沉重的代价. .尽管如此,对于真正经验丰富的大师级程序员来说,在真正了解他们正在做什么以及为什么会这样做的情况下,在各种罕见的用例中都可以使用各种危险的工具exec,可供您使用(或误用)你的心血来潮:Python不会妨碍你! - )