2013-04-16 264 views
24

我已經花了幾個小時在這裏和其他地方閱讀以及嘗試,但我並不真正瞭解我確定的是一個非常基本的概念:傳遞值(作爲變量)在不同的功能之間。Python:在函數之間傳遞變量

例如,我在一個函數一大堆值分配給一個列表,然後以後要使用在其他功能列表:根據我的理解是什麼函數參數做,我

list = [] 

def defineAList(): 
    list = ['1','2','3'] 
    print "For checking purposes: in defineAList, list is",list 
    return list 

def useTheList(list): 
    print "For checking purposes: in useTheList, list is",list 

def main(): 
    defineAList() 
    useTheList(list) 

main() 

預計這樣做如下:

  1. 將'list'初始化爲空列表;調用main(至少,我知道我已經正確...)
  2. 在defineAList()中,將某些值分配到列表中;然後將新列表傳遞迴main()
  3. 在main()中,調用useTheList(list)
  4. 由於'list'包含在useTheList函數的參數中,我期望useTheList現在可以使用列表由defineAList()定義,而不是在調用main之前定義的空列表。

但是,這顯然是一種錯誤的理解。我的輸出是:

For checking purposes: in defineAList, list is ['1', '2', '3'] 
For checking purposes: in useTheList, list is [] 

所以,既然「回報」,顯然沒有做什麼,我想這樣做,或至少它不會做它,我覺得它應該的方式......這是什麼實際上做?使用這個例子,你能告訴我,我需要做些什麼才能從defineAList()中獲取列表並在useTheList()中使用它?當我看到它們發生時,我傾向於更好地理解事物,但我見過的正確參數傳遞的很多示例也使用了我不熟悉的代碼,並且在確定發生了什麼的過程中,我我並沒有真正理解這個概念。我使用2.7。

ETA-在過去,問了一個類似的問題,有人建議我使用全局變量而不是僅僅局部變量。如果在這裏也是相關的 - 爲了我所採用的課程的目的,我們不允許使用全局變量。

謝謝!

回答

26

這是什麼是真正發生的事情:

global_list = [] 

def defineAList(): 
    local_list = ['1','2','3'] 
    print "For checking purposes: in defineAList, list is", local_list 
    return local_list 

def useTheList(passed_list): 
    print "For checking purposes: in useTheList, list is", passed_list 

def main(): 
    # returned list is ignored 
    returned_list = defineAList() 

    # passed_list inside useTheList is set to global_list 
    useTheList(global_list) 

main() 

這是你想要什麼:

def defineAList(): 
    local_list = ['1','2','3'] 
    print "For checking purposes: in defineAList, list is", local_list 
    return local_list 

def useTheList(passed_list): 
    print "For checking purposes: in useTheList, list is", passed_list 

def main(): 
    # returned list is ignored 
    returned_list = defineAList() 

    # passed_list inside useTheList is set to what is returned from defineAList 
    useTheList(returned_list) 

main() 

你甚至可以跳過臨時returned_list並直接將返回的值useTheList

def main(): 
    # passed_list inside useTheList is set to what is returned from defineAList 
    useTheList(defineAList()) 
+0

謝謝您的詳細解釋!我知道我在這裏錯過了一些基本的東西。 :) – user2113818

+7

請不要命名的東西'列表',你失去了調用內置'列表'的能力:) –

+1

我不寫我什麼時候我真的打算跑的目的! – user2113818

7

你只是錯過了一個關鍵步驟。你必須明確地將返回值傳遞給第二個函數。

def main(): 
    l = defineAList() 
    useTheList(l) 

或者:

def main(): 
    useTheList(defineAList()) 

或(雖然你不應該這樣做也許乍一看不錯,但全局只是因爲你從長遠來看悲痛!):

l = [] 

def defineAList(): 
    global l 
    l.extend(['1','2','3']) 

def main(): 
    global l 
    defineAList() 
    useTheList(l) 

該函數返回一個值,但不會像您的代碼所假定的那樣在任何類型的全局命名空間中創建符號。您必須實際捕獲調用作用域中的返回值,然後將其用於後續操作。

+0

謝謝你 - 我感謝你提供的不僅是一個例子,但爲什麼它這樣解釋的功能。 – user2113818

3

你的回報是無用的,如果你不給它分配

list=defineAList() 
1

return返回一個值。無論你給這個價值什麼名字都沒有關係。返回它只是「傳遞出去」,以便別的東西可以使用它。如果你想使用它,你必須從外面抓住它:

lst = defineAList() 
useTheList(lst) 

從內defineAList返回list並不意味着「讓它所以程序的所有的剩餘可使用變量」。它意味着「傳遞這個變量,並給程序的其餘部分一個機會來抓住它並使用它」。您需要將該值分配給函數外部的某個部分以便使用它。另外,正因爲如此,沒有必要提前定義您的清單list = []。在defineAList裏面,你創建一個新列表並返回它;此列表與您在開始時使用list = []定義的列表沒有任何關係。

順便提一下,我將變量名從list更改爲lst。使用list作爲變量名稱並不是一個好主意,因爲它已經是內置Python類型的名稱。如果您創建自己的變量list,則無法再訪問內置的變量。

2

閱讀名稱空間的概念。在函數中分配變量時,只能在該函數的名稱空間中分配它。 但顯然你想在所有功能之間使用它。

def defineAList(): 
    #list = ['1','2','3'] this creates a new list, named list in the current namespace. 
    #same name, different list! 

    list.extend['1', '2', '3', '4'] #this uses a method of the existing list, which is in an outer namespace 
    print "For checking purposes: in defineAList, list is",list 
    return list 

或者,可以圍繞它傳遞:

def main(): 
    new_list = defineAList() 
    useTheList(new_list) 
1

從一個函數傳遞變量作爲參數傳遞給其它功能可以像這樣

這樣定義

函數來完成
def function1(): 
global a 
a=input("Enter any number\t") 

def function2(argument): 
print ("this is the entered number - ",argument) 

呼叫這樣

function1() 
function2(a) 
+0

縮進是完全關閉的,應該先修復。其次,由於您指定了'global a',因此'function1()'中不需要'return'語句。通常使用'全局'變量顯然是不好的味道,但在這樣一個簡單的應用程序中完全沒有根據。參看[本](http://stackoverflow.com/questions/19158339/why-are-global-variables-evil)。 –

+0

@ N.Wouda我怎樣才能執行這樣的操作,而不使用全球? –

+1

'def function1():返回輸入(「輸入任意數字\ t」)'。然後,'a = function1()'和'function2(a)'。當然,你應該適當地對這段代碼進行格式化,但是我不可能在評論中實現。 –