在另一个函数中访问函数内部的Python变量

在另一个函数中访问函数内部的Python变量,python,function,python-2.7,variables,Python,Function,Python 2.7,Variables,假设我有一个函数: func1(): do something a,b = somevalues,somevalues func2(): do something 现在让我们假设我有另一个函数: func1(): do something a,b = somevalues,somevalues func2(): do something 我现在想在func2中使用a,b,它们是在func1中计算的 我试着用 func1(): do

假设我有一个函数:

func1():
    do something
    a,b = somevalues,somevalues
func2():
    do something
现在让我们假设我有另一个函数:

func1():
    do something
    a,b = somevalues,somevalues
func2():
    do something
我现在想在func2中使用a,b,它们是在func1中计算的

我试着用

func1():
    do something
    a,b = somevalues, somevalues
    func1.a = somevalues
    func1.b = somevalues

func1()
func1.a
但是使用这个,我必须在使用a,b之前每次运行func1

func1还创建了一些绘图以及计算a、b


那么,是否可以在不调用func1的情况下使用func2中的a、b?

这可能就是您想要的。另外,我建议您学习Python入门教程

func1():
    #do something
    a,b = somevalues, somevalues
    return a, b

func2(a, b):
    #do something on a and b

a, b = func1()
func2(a, b)
现在,您可以在任何地方使用x和y,而无需每次调用func1。例如,在func2中,以这种方式:

def func2(a, b):
    do something
然后分别用x和y调用func2:

func2(x, y)
这可能是做你想做的事情最简单的方法。下面是另一个:

class class1():
    a,b = somevalues, somevalues
    @staticmethod
    def func1():
        do something

func2(class1.a, class1.b)
class1.func1()
这种方法有效而不起作用的原因与Python处理函数和类的方式有关

函数体在第一次调用之前不会执行。因此,当你有:

def func1():
    func1.a = somevalue
…如您所发现的,在至少调用一次func1之前,您无法访问func1.a

但是,对于类,类的主体在编译代码时运行。因此,当您这样做时:

class example:
    a = somevalue
…您可以立即访问示例a

编辑:

回答注释中的问题:如上所示,使用Python中的类本身访问func1、a或b,类是对象,就像任何其他对象一样:

class1.a
class1.func1()
你也可以为自己创造一条捷径:

func1 = class1.func1
func1()
另一种方法是创建a和b实例属性,而不是类属性,这样您就可以拥有不同版本的a和b

class class1:
    def __init__(self, a, b):
        self.a, self.b = a, b
    @staticmethod
    def func1():
        dosomething

obj1 = class1(somevalue1A, somevalue1B)
obj2 = class1(somevalue2A, somevalue2B)
func2(obj1.a, obj1.b)
func2(obj2.a, obj2.b)
obj1.func1()
obj2.func1()
class1.func1()

最后三行都调用相同的函数,因为obj1.func1、obj2.func1和class1.func1都指向class1的相同方法。请注意,可以从类class1和类的实例obj1、obj2调用func1的原因是func1是一个静态方法

你能从func1返回a,b,然后将它们作为参数传递给func2吗?@robert:我不知道!!你能详细说明一下吗?你需要重新思考你的代码结构。如果需要独立于func1的a和b,则不应在其中声明它们。@MichaelRCURTIS:但我在func1中计算它们,就像在func1中的几个绘图中需要它们一样。“那么你是建议我在函数之外计算它们吗?”“是的,没错。例如,您可以将它们存储为类的成员变量,如果考虑到它们的含义,这是有意义的。但是由于func1创建了许多绘图,我不想调用func1来访问这些变量,因为我需要关闭所有绘图!那么,为什么在绘制绘图的函数中为a和b赋值呢?我现在接受这个答案!但正如@michaelccurtis所指出的,我将尝试重新构造我的代码!我现在明白了!但在这种情况下,如何调用func1?我是否需要使用该类并调用它,还是可以像func1一样直接调用它?您可以使用该类来调用它,因为它是该类的静态方法,或者您可以创建该类的实例。我会补充一些解释。@P编辑我已经在回答中回答了您的问题。谢谢您的详细解释!我将试着慢慢地理解它