2008-12-10 66 views
1

我是python的初學者,有一個問題,對我來說很困惑。 如果我首先定義一個函數,但是在函數中我必須使用一個在下面的另一個函數中定義的變量,我可以這樣做嗎?或者,如何將另一個函數的返回值導入到函數中? 例如:關於python的變量範圍的一個小問題

def hello(x,y): 
    good=hi(iy,ix) 
    "then do somethings,and use the parameter'good'." 
    return something 

def hi(iy,ix): 
    "code" 
    return good 
+0

你的問題並不完全清晰。這兩種方法如何相關?他們屬於同一個班級嗎? – 2008-12-10 22:23:25

+0

是的,他們在同一個班級中,只是第一個功能需要第二個功能來做某件事情的結果。 – NONEenglisher 2008-12-10 22:28:13

回答

5

的功能hello範圍和hi是完全不同的。他們沒有任何共同的變數。

請注意,調用hi(x,y)的結果是一些對象。用功能hello中的名稱good保存該對象。

hello中名爲good的變量是一個不同的變量,與函數hi中名爲good的變量無關。

它們拼寫相同,但存在於不同的命名空間中。爲了證明這一點,改變兩個函數之一的good變量的拼寫,你會發現事情仍然有效。


編輯。跟進:「所以如果我想用hello函數中的hi函數的結果怎麼辦?」

沒什麼不尋常的。密切關注hello

def hello(x,y): 
    fordf150 = hi(y,x) 
    "then do somethings,and use the variable 'fordf150'." 
    return something 

def hi(ix, iy): 
    "compute some value, good." 
    return good 

一些腳本評估hello(2, 3)

  1. Python爲hello的評估創建了一個新的命名空間。

  2. hello,x綁定到對象2。綁定是按位置順序完成的。

  3. hello,y綁定到對象3

  4. hello,Python中評估第一語句,fordf150 = hi(y, x)y是3,x是2

    一個。 Python爲hi的評估創建一個新的名稱空間。

    b。在hi中,ix綁定到對象3。綁定是按位置順序完成的。

    c。在hi中,iy綁定到對象2。d)。在hi中,發生了一些事情,並且good被綁定到某個對象,例如3.1415926

    e。在hi中,執行return;將對象標識爲hi的值。在這種情況下,該對象由good命名,並且是對象3.1415926

    f。放棄hi命名空間。 good,ixiy消失。但是,對象(3.1415926)仍然是評估hi的值。

  5. hello,Python中完成的第一條語句,fordf150 = hi(y, x)y是3,x是2的hi值是3.1415926

    a。 fordf150綁定到通過評估hi,3.1415926創建的對象。

  6. hello中,Python轉入其他語句。

  7. 在某個點something被綁定到一個對象,比如2.718281828459045

  8. hello中,執行return;將一個對象標識爲hello的值。在這種情況下,該對象的名稱是something,並且是對象2.718281828459045

  9. 命名空間被丟棄。 fordf150something消失,如xy。然而,對象(2.718281828459045)仍然是評估hello的值。

無論程序或腳本hello都能得到答案。

2

您的示例程序的工作,因爲「好」的兩個實例是不同的變量(你恰好有兩個變量具有相同的名稱)。以下代碼是完全一樣的:

def hello(x,y): 
    good=hi(iy,ix) 
    "then do somethings,and use the parameter'good'." 
    return something 

def hi(iy,ix): 
    "code" 
    return great 
1

「hello」函數並不介意調用尚未定義的「hi」函數,只要在兩個函數都沒有嘗試實際使用「hello」函數定義。

3

如果要從函數內部爲全局名稱空間定義一個變量,從而使其可以通過此空間中的其他函數訪問,則可以使用全局關鍵字。下面是一些示例

varA = 5 #A normal declaration of an integer in the main "global" namespace 

def funcA(): 
    print varA #This works, because the variable was defined in the global namespace 
       #and functions have read access to this. 
def changeA(): 
    varA = 2 #This however, defines a variable in the function's own namespace 
       #Because of this, it's not accessible by other functions. 
       #It has also replaced the global variable, though only inside this function 
def newVar(): 
    global varB #By using the global keyword, you assign this variable to the global namespace 
    varB = 5 

def funcB(): 
    print varB #Making it accessible to other functions 

結論:在函數中定義的變量保留在函數的名稱空間中。它仍然可以訪問全局名稱空間以進行只讀操作,除非該變量已用全局關鍵字調用。

全球一詞並不完全是全球性的,因爲它起初看起來似乎是全球性的。它實際上只是您工作文件中最低命名空間的鏈接。全局關鍵字不能在另一個模塊中訪問。

作爲一個溫和的警告,這可能被認爲是一些較少的「良好做法」。