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

Python 从另一个函数访问函数内部的变量,python,Python,我有一个函数AB,它有一个参数,AB有一堆循环,我有一个计数器,它跟踪它循环了多少。它(必须)返回正确或错误的答案 我有第二个函数,叫做AC,它调用了两个AB实例,其中的参数不同,并对它们进行了比较 if (AB(option1) == True and AB(option2) == False): result = "Option1 Wins" elif (AB(option1) == False and AB(option2) == True): result = "Op

我有一个函数AB,它有一个参数,AB有一堆循环,我有一个计数器,它跟踪它循环了多少。它(必须)返回正确或错误的答案

我有第二个函数,叫做AC,它调用了两个AB实例,其中的参数不同,并对它们进行了比较

if (AB(option1) == True and AB(option2) == False):
     result = "Option1 Wins"
elif (AB(option1) == False and AB(option2) == True):
     result = "Option2 Wins"
if (AB(option1) == True and AB(option2) == True):
     result = ??
但是,如果两种情况都是“True”,我需要知道哪种情况首先达到“True”,因此这意味着我需要知道它循环了多少次(我需要知道计数器变量的值)

如何访问变量


我正在考虑创建一个helper函数来访问它,但我不确定这是否可行/如何做到这一点

您可以从python中的函数返回多个值:

def AB(param):
   return True, 1

val = AB(1) # it will be (True,1), so it's a set
val, val1 = AB(2) # val = True, val1 = 1
因此,如果只想保留一个返回值(应该在不同的变量中获取它们),那么在代码中应该检查AB(param)[0]以检查True


但是您的代码是错误的,因为每次检查输出时都调用AB(),这将执行所有循环,最终可能会对相同的输入产生意外的响应。您应该先从AB()获取每个参数的输出,然后在if块中检查它们。

您可以使用全局变量存储计数器的值。有关更多详细信息,请参阅。

零计算为
False
,非零计算为
True

如果
AB
失败,则返回
0
,否则返回循环数:

def AB(param):
    if failed:
        return 0
    else:
        return counter
用法:

if AB(option1) and not AB(option2):
    result = "Option1 Wins"
elif not AB(option1) and AB(option2):
    result = "Option2 Wins"
elif AB(option1) < AB(option2):
    result = "Option1 Wins"
else:
    result = "Option2 Wins"
如果AB(选项1)而非AB(选项2):
结果=“选项1获胜”
elif非AB(选项1)和AB(选项2):
结果=“选项2获胜”
elif AB(选项1)
面向对象解决方案:创建一个类,将此方法作为成员函数,将计数器变量作为成员变量。现在,您可以从任何地方为该类的任何对象检查该值

同样在代码中,无需多次调用
AB

o1 = AB(option1)
o2 = AB(option2)
if o1 and not o2:
     result = "Option1 Wins"
elif not o1 and o2):
     result = "Option2 Wins"
elif o1 and o2:
     result = ??
面向对象的解决方案可能如下所示(代码未经测试)

类解算器(对象,选项):
达到=0
选项
状态=错误
def AB(自我):
#实施。使用self.option并更新self.reach和self.status
opt1=解算器(选项1)
opt2=解算器(选项2)
o1=opt1.AB()
o2=opt2.AB()
如果o1.状态而非o2.状态:
结果=“选项1获胜”
elif非o1状态和o2状态):
结果=“选项2获胜”
elif o1和o2:
如果o1.reached
是的,当然我也想这么做,但每个函数都要单独检查,并且必须只返回一个boolean@HelloMellow检查我编辑的回复,我太快点击了发送。您的代码有一些问题,因为您一直在执行函数。这是一个好主意,我将在之前获取输出,然后在之后的if块中检查它,但是对于AB函数,我只能严格返回布尔值。所以它必须是
返回True
,不能是
返回True,1
@HelloMellow我可以看到另一个提到globals的响应,我不喜欢使用它。如果可以添加参数,则将循环计数器作为第二个参数传递,并在函数中更改它。这样,您将返回True或False,以及计数器本身。这也很聪明,但通常不允许更改参数或返回超出预期的内容。我检查了文件,我们的教授写道:“我不鼓励使用可选参数。您可以通过编写单独的函数来绕过它。”(就像一个助手功能)。“我100%肯定他会因为不遵守“他的标准”而被扣分。”如果我真的添加了参数:\哇,我不敢相信我没有想到这是一个答案,但遗憾的是,我们的教授严格反对全局变量。也许这就是为什么我没有考虑它。哈哈哈,你知道哪个计数器是哪个吗?必须
AB
只返回
True
False
?如果我们能返回更多,他会这样做lps.我们可以修改参数吗,例如,
option1
?AB必须返回一个布尔值,那么修改参数的确切含义是什么?我99%确定我们不允许这样做,除非你想的是不同的东西为什么AB必须返回一个布尔值?整数可以被解释为布尔值,使用C约定0为假,其他的都是假是的。为什么不返回0以失败,并返回循环索引以通过?啊,这是有意义的,有一个问题,如果我单独运行AB函数,它不会返回一个整数吗?因为AB函数将单独测试,它应该返回一个布尔值。如果它必须只返回类型为
bool
的值,即仅
true
或者
False
如果不使用全局计数器,我不知道如何回答这个问题。如果您在布尔表达式中测试
AB
,而不是将返回值与布尔值进行比较,它将正常工作。
class solver(object, option):
    reached = 0
    option = option
    status = False

    def AB(self):
        # implementation. use self.option and update self.reached and self.status

opt1 = solver(option1)
opt2 = solver(option2)
o1 = opt1.AB()
o2 = opt2.AB()

if o1.status and not o2.status:
     result = "Option1 Wins"
elif not o1.status and o2.status):
     result = "Option2 Wins"
elif o1 and o2:
     if o1.reached < o2.reached:
         # o1 reached first