Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何传递局部变量并直接从另一个函数访问变量?_Python_Variables_Function_Language Features - Fatal编程技术网

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
编译器“知道”barename
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不会妨碍您的工作

我知道,我知道,这个问题由来已久,公认的答案已经很好了

只需增加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)