如何从另一个函数直接访问局部变量?
假设我有这个:
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 不会阻止你!-)