2017-06-16 143 views
0

我似乎很难理解参数传递和函数返回变量的概念。我正在研究一个涉及通过使用rest协议制作的python gui向机器人发出命令的项目。我目前正在编写故障安全代码,以禁止用户多次按下加载任务按钮并加载一堆相同的任务。下面是我的代码:函数返回函数的变量 - Python

demo = 'e1af13ba-4f38-11e7-9626-f44d3061db09' 
mission = 1 


def compMissionQueue(): 
    getMissionQueue = robot.get_mission_queue()[1][0] 
    #print(getMissionQueue) 
    missionID = getMissionQueue['id'] 
    #print(missionID) 
    missionGUID = robot.get_mission_GUID_from_queue(missionID)[1]['mission_id'] 
    print(missionGUID) 
    if missionGUID != mission: 
     print('Mission successfully added to queue') 
    else: 
     print('Mission already in queue. Add again?') 

def techDemo(): 
    def loadMission(): 
     #runDemo = robot.load_mission(demo) 
     #robot.continue_robot() 
     #robot.pause_robot() 
     #robot.delete_from_mission_queue(demo) 
     mission = demo 
     return mission 
    loadMission() 
    compMissionQueue() 
    print(mission) 
    return mission 

功能techDemo通过按下按钮在GUI“触发”。我试图做的是使用compMissionQueue函数来检查一个任务是否已经加载到队列中,如果是的话,打印一些消息给用户。我试着检查'mission'的值是否通过在其上运行多个打印调用而返回,并且它不是从我可以告诉的任何地方返回mission = demo,它始终在我第一次设置任务时打印出'1'。如果你能指出我正确的方向,那将是非常感谢。谢谢!

+0

首先你的代码不运行。它给出语法错误'compMissionQueue()'没有定义 –

+0

那么,你从嵌套的loadMission函数返回一个值,但是你用返回的值做了什么?你需要把它分配给某些东西。 –

+0

'techDemo'对'mission'一无所知,因为它是'loadMission'范围内的局部变量。你应该执行'mission = loadMission()',那么yu将能够从'techDemo'中返回它。 – DeepSpace

回答

1

你的问题是你指的是在不同范围内的变量'任务'。

考虑这个例子:

mission = 1 
def set_mission(): 
    mission = 2 
print(mission) 
set_mission() 
print(mission) 

会打印:

1 
1 

'使命' 似乎并没有得到改变呵呵。发生什么事是'任务'是两个独立的变量,一个全局变量(定义的第1行)和一个局部变量(定义第3行)。本地实例仅存在于set_mission()范围内,并在之后被删除。当我们将'任务'设置为2时,我们设置本地实例而不是全局实例。当我们打印出来的时候,我们正在打印一个永远不会被触及的全局实例!

有两种处理方法。

选项1

只能使用一个全局变量:

mission = 1 
def set_mission(): 
    global mission 
    mission = 2 
print(mission) 
set_mission() 
print(mission) 

选项2

传递变量作为参数,然后返回它:

mission = 1 
def set_mission(my_mission): 
    my_mission = 2 
    return my_mission 
print(mission) 
mission = set_mission(mission) 
print(mission) 

这两个将返回所需

1 
2 

小心范围,如果有疑问,所以你不太可能会感到困惑使用功能的不同的变量名!

+0

我接受了您的建议,并使用选项1仅使用全局变量来执行任务。因此,如果我的理解正确,通过添加“全球任务”这一行,我们基本上告诉程序,我们在该函数内使用了与我们在该函数范围之外定义的相同的“任务”变量,是正确的吗?此外,它是更好的还是有一个传统的方式是你所展示的两个选项中的首选? –

+0

如果改变'使命'的价值没有直接的因果效应,那么使用选项1是完全可以接受的。我的意思是,如果在设置变量后它可以坐在那里过着幸福的生活,直到需要阅读,那么它就是精细。但是,如果您希望在设置“任务”时执行代码,则应将其封装在setter函数中。例如,如果每当你设置一个新的任务,你需要记录它设置的当前时间,然后你应该使用setter。 –

+0

哦,这是有道理的!感谢您的详细解释,帮助我了解范围的工作方式,以及何时使用不同的方法来处理它们。非常感激! –