Python 如何传递局部变量并直接从另一个函数访问变量?
假设我有这个:Python 如何传递局部变量并直接从另一个函数访问变量?,python,variables,function,language-features,Python,Variables,Function,Language Features,假设我有这个: def a(dict): locals().update(dict) print size def b(): size = 20 f(locals()) 要直接从a函数访问size变量,我必须做什么?我知道: size = dict["size"] 但我认为应该有一个更直接的方法。我尝试使用locals().update(dict),但没有成功。有更好的方法吗 print size 无法工作,因为编译代码时不知道“大小”。如果按以下方式更改代码,则代码
def a(dict):
locals().update(dict)
print size
def b():
size = 20
f(locals())
要直接从a
函数访问size
变量,我必须做什么?我知道:
size = dict["size"]
但我认为应该有一个更直接的方法。我尝试使用locals().update(dict)
,但没有成功。有更好的方法吗
print size
无法工作,因为编译代码时不知道“大小”。如果按以下方式更改代码,则代码将正常工作:
def a(dict):
locals().update(dict)
print locals()["size"]
def b():
size = 20
a(locals())
但正如对你的问题的评论已经表明的那样:这是一个非常奇怪的代码。如果你解释一下你真正想做什么,我确信有更好的解决方案。这对你有帮助吗
def print_size(size=None):
print(size)
dict = {'size': 'XXL'}
print_size(**dict)
您可以使用闭包访问另一个函数的作用域:
def b():
def a():
print size
size = 20
a()
诀窍是将相互属于的函数堆叠在一起。这样,内部函数a可以访问外部函数b的局部变量
但是我不知道你到底在干什么,所以我不确定这是否有帮助。Python编译器通过在编译时识别函数正在访问的barenames是否是本地的(即,在函数中指定或绑定的barenames)来优化对局部变量的访问。因此,如果您编写代码:
def lv1(d):
locals().update(d)
print zap
编译器“知道”barenamezap
不是本地的(未在函数lv1
中赋值),因此它编译代码以将其作为全局访问—无论d
包含什么都无关紧要
如果您喜欢缓慢而臃肿的代码,那么可以通过在函数中使用exec
来挫败优化——当编译器看到关键字exec
时,它知道您正试图使代码尽可能缓慢、臃肿且有缺陷,因此它会通过不以任何方式进行优化来进行协作,几乎不进行优化
因此,以下代码可以根据您的需要工作:
def lv1(d):
exec ""
locals().update(d)
print zap
lv1({'zap': 23})
它根据您的需要发出23
我希望从上面的“面无表情的幽默”中可以清楚地看出,不推荐使用这种技巧,但我最好非常明确地说出来:为了写
print zap
而不是print locals()['zap']
,你在性能方面付出了巨大的代价。尽管如此,就像各种危险的工具一样,对于真正有经验的大师级程序员来说,这些工具在罕见的用例中非常有用,他们真正知道自己在做什么以及为什么这样做,exec
就在那里,可供您随心所欲地使用(或误用):Python不会妨碍您的工作 我知道,我知道,这个问题由来已久,公认的答案已经很好了
只需增加2美分,因为这看起来很明显,但没有提到:通过显式地为其指定一个(默认)值,使大小成为本地大小
def a(dict):
size = 20 # size default value <- quick (and dirty?) fix
locals().update(dict)
print (size)
def b():
size = 20
a(locals())
上面的例子适用于python2和python3你到底想做什么?我想直接访问变量,而不是通过
locals[“size”]
你的大局是什么?可能还有更好的方法。如果你想从另一个函数中访问变量,它们不是“局部的”,而是“全局的”。你想做什么,需要这么多全局变量?函数b()
的最后一行不应该是a(locals())
?这似乎是一个真正依赖于所用Python版本的黑客攻击。是否有任何保证,这将继续工作?它必须在任何兼容的Python(1.*或)2.*实现中工作;它不能也不能在任何兼容的3.*实现中工作,因为制作Python3的全部目的是使我们能够以这种方式打破向后兼容性。但是,即使是print-goo
也停止在Python3中工作(必须是print(goo)
),因此exec
语法和语义的类似弱化在比较中几乎不是一个主要问题;-)。为什么会有一个空字符串被发送到exec
?@Geo,你正在exec
执行的字符串并不重要——仅仅是函数范围中没有特定指令的exec
语句的存在就告诉Python编译器(在Python<3.0中)关闭通常的基本优化(特别是检测局部变量[[barenames]],这通常使得在它们所在的函数中访问它们比访问全局变量快得多)。因此,您也可以执行一个空字符串,因为您没有更多要执行的内容,您只需确保此函数中的正常优化已关闭!@martinako,我相信Python 3不允许对函数的本地名称空间进行如此任意、大规模的修改,不;exec
现在是一个内置函数,甚至不是sta别再提了。
def f(x, *args, **kwargs):
y = 10
locals().update(kwargs)
print (x, y)