2014-03-29 115 views
-1

Python(我使用2.7)中有一些東西在困擾着我(ha!)。這是我得到NameError: global name 'x' is not defined當我運行這段代碼:Python:在函數之間使用變量

def function1(): 
    x = 1 
    return 0 

def function2(): 
    function1() 
    print(x) 
    return 0 

function2() 

這不是對我來說是嚴重的問題,但我真的很好奇,爲什麼這不能打印1.這是有道理的,右在我心中流。定義變量x的函數在調用之前被定義,並且該函數在print(x)之前被調用。我真的沒有看到爲什麼這個代碼不起作用。也許我想這個的方式是有缺陷的。無論哪種方式,爲什麼不打印1?先謝謝您的幫助!

+1

詞法範圍界定:http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_vs._dynamic_scoping – uselpa

+0

我改變了標題,因爲我意識到有點太遲了,這很容易讓人誤解。抱歉!並感謝所有偉大的答案。 – Mikeureko

回答

3

是,你的想法是有缺陷的。在function1中定義的變量x對於該函數是本地的。它在其他地方不存在。當你用另一個函數調用一個函數時,這並不意味着被調用函數的所有變量都會被轉儲到調用函數中。只有返回值被傳回。如果你想在第二個函數中使用x,你應該從function1返回它。 (即使這樣,它不會創建一個名爲xfunction2變量,它只會返回,而如果你願意,你就可以分配給一個變量在function2,或打印出來,或什麼的。)

+0

也許你應該補充說,你必須在function2()裏打印function1()。 – Dehli

+0

在問這個問題之前,我真的不知道有多少變量作用域。我認爲它們可以被程序的所有部分使用,即使它們是在函數內部定義的。不管怎樣,謝謝! – Mikeureko

+0

Python名稱空間的分層方法對於能夠編寫好的代碼非常關鍵,並且在測試完成後信任它。 –

0

這兩個函數都使用global x作爲第一行。這將使你的代碼工作。但是,無論如何,在函數間傳遞變量並不是一個好習慣。返回值和使用參數是一個好習慣。

如果您正在測試變量共享,您正在使用全局變量。爲此,與javascript不同,在嘗試獲取它之前,您需要使用global x,就像在php中一樣(除非使用嚴格模式,否則不會在php中出錯)。

+2

的確,這可以解決問題,但是全局變量通常不好用,應該避免。 – Dehli

+0

是的,我補充說。 –

0

x範圍僅function1()這就是爲什麼你不能打印xfunction2(),即使你打電話function1()(當您從function1()返回,x將被銷燬

0

由於function1範圍內的變量x是本地的,並且function2沒有「看見」這個變量。