2012-07-08 23 views
3

我真的很感激,如果你能給我一個快速的手,我有這個小問題。到目前爲止,在編程中,我已經完成了一些C,但是我很困惑如何通過Python中的函數傳遞變量。新手變量傳球

我確信這個問題已被多次詢問,但我不知道要搜索什麼。

我的代碼是:

x=0 
def getinput(x): 
    x = input('Enter x: ') 
def addtwo(x): 
    x = x + 2 
def printans(x): 
    print 'x is', + x 

getinput(x) 
addtwo(x) 
printans(x) 

printans最終總是打印0。我確信這是因爲函數內部的變量是本地的,但我不知道如何解決這個問題。

感謝您的幫助!

+0

Downvoter:你想提供一個理由嗎?這是一個寫得很好的問題,它解決了一些新的Python程序員不熟悉的問題。 – inspectorG4dget 2012-07-08 03:19:48

+1

我認爲有些人認爲應該減少他們認爲對自己來說太過基本的問題。彷彿它對於一個初學者來說是錯誤的問一個合法的初學者的問題。並不是每個人都知道所有正確的術語來尋找正確的答案。我支持這是一個寫得很好的問題,不值得讚揚。 – jdi 2012-07-08 03:57:08

+0

似乎我已經看到這種特定類型的問題(無法理解參數傳遞和返回值如何工作)的突然激增,無論是在這裏還是在互聯網上的其他地方。我想知道是否有人推出了一個錯誤的教程? – 2012-07-08 04:52:58

回答

6

問題是,你沒有返回你的函數中得到/計算的值

我不會給你所有的代碼,但如果你理解這個例子,你將能夠根據需要對你自己的代碼進行必要的調整,作爲學習編程的一部分蟒蛇。

def addtwo(x): 
    x = x + 2 # compute your result 
    return x # return the result to caller 


result = addtwo(5) # save the returned value 
print result  # print it out 

產生

7 

你要因爲它得到你想要在你的程序中使用的值做類似getinput()功能太多的東西。這與printans()形成鮮明對比,它僅僅需要打印信息,但不計算任何需要返回給您的信息。

注意,當你更舒服,您可以縮短你的代碼/表達,所以上面的例子,你的整個功能可能包括

def addtwo(x): 
    return x + 2 

但在那之前有沒有錯做事一步一步明確。

2

正如您所說,函數中的變量是本地的。解決它的方法是從你的函數返回值:

def getinput(): 
    return input('Enter x: ') 

def addtwo(x): 
    return x + 2 

def printans(x): 
    print 'x is', + x 

x = getinput() 
x = addtwo(x) 
printans(x) 

爲了把它在C組術語,與數字打交道時,它彷彿一切都是按值傳遞的工作原理相同。

3

這是一個有關全球和本地範圍的問題。雖然你函數可以訪問x作爲一個全球範圍內的值,當您重新分配的變量,你遮蔽了全球性的,但你沒有返回值:

# return local 
def getinput(x): 
    x = input('Enter x: ') 
    return x 

# affect global 
def getinput(x): 
    global x 
    x = input('Enter x: ') 

使用局部變量和返回值通常更喜歡修改全局變量,除非你有一個完全合理的情況。

關於可變和不可變類型

還有第二個情況下,這種情況,那是關於對象的你所影響的說明文字。例如,intstring是不可變的。因此,如果不創建新對象,則無法更改其值。 A listdict是可變類型的示例。你可以添加和刪除它們,改變它們的值。

考慮一個可變類型list

aList = [] 
def func(): 
    aList.append(1) 

print aList # prints [] 
func() 
print aList # prints [1] 

這將追加到全局列表就好了,甚至沒有指定一個全球性的關鍵詞,因爲列表本身仍然是相同的列表對象。但是,如果你要覆蓋一個新的列表清單,如果沒有全球性的,它不會全局生效:

aList = [] 
def func(): 
    aList = [1] 

簡而言之,可變類型並不需要全球的關鍵字,如果你只是要修改對象的內容,但不分配新的對象。

+0

謝謝大家!我正在尋找一種方法來解決我的問題,我得到了兩個! – 2012-07-08 02:46:28

+0

有兩種方法,但「返回本地」幾乎總是比較好的一種。絕對使用那個。 – 2012-07-08 02:47:25

+1

它更像是一個可變/不可變的東西。如果你修改了一個函數內部的可變類型(比如'list'),那麼這些變化會在全局範圍內持續存在。對於像int這樣的不可變類型,這不是真的。 – inspectorG4dget 2012-07-08 03:18:44