2017-06-16 140 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

哦,這是有道理的!感謝您的詳細解釋,幫助我瞭解範圍的工作方式,以及何時使用不同的方法來處理它們。非常感激! –