2012-04-17 60 views
0

我是Python初學者。我寫了類似如下的代碼只是爲了練習..請看看它爲什麼全局變量不能在Python的不同函數中工作?

i=1 
def wrte(): 
global i 
while i<5: 
    print "%s .Line..\n" %i 
    i+=1 

def appnd(): 
    j=i 
    while i in range(i,j+3): 
    print "%s .Line..\n" %i 
    i+=1 

def Main(): 
    wrte() 
    appnd() 

Main() 

輸出類似如下

1 .Line.. 

    2 .Line.. 

    3 .Line.. 

    4 .Line.. 

**Traceback (most recent call last): 
    Line 18, in <module> 
    Main() 
    Line 16, in Main 
    appnd() 
    Line 9, in appnd 
    j=i 
UnboundLocalError: local variable 'i' referenced before assignment** 

預期結果::接下來的順序應該附加像

5. Line.. 
6. Line.. 
7. Line.. 

請幫我在這..

+3

這是一個在'wrte',想想你在做什麼正確的,使其工作... – 2012-04-17 09:06:44

回答

3

您需要在電子商務的global定義在你使用這個變量的函數中。

def appnd(): 
    global i 

注意:如果可能,請將全局變量和相關函數移動到類中。

0

加入

global i 

j=i 

應該解決的問題

+0

是的,這將工作! 每個函數都需要明確的「全局」關鍵字讓我們知道我們打算使用全局變量:) – pk10 2014-04-18 20:47:57

0

你的定義是當地的範圍。如果你在一個函數中聲明一個變量爲全局變量,這並不意味着它將被應用於所有函數。你必須在appnd()函數中聲明我是全局的。儘管如此,這並不意味着你的風格是正確的。你寧願將你的變量傳遞給函數。

0

下一個定義將工作:

def appnd(): 
    j=i 
    while i in range(i,j+3): 
    print "%s .Line..\n" %i 

# it would print infinitely, but will work 

在編譯時Python的看着變量在函數中使用來定義範圍尋找他們的方式。在你的appnd的定義中,它看起來分配爲i,因此試圖將其作爲局部變量進行威脅。在我的代碼中沒有賦值,所以Python只需從父範圍獲得i的值 - 在這種情況下,i既不是本地也不是全局的,它被稱爲自由變量Execution model - Scopes and Binding - 強烈推薦閱讀。

0

我想你應該知道什麼時候應該使用global,否則它不會在你的寫函數中。如果你只讀取變量,你可以忽略它,我認爲你想在你的追加函數中使用,但是你有一個i + = 1,所以你修改它。只要改變追加做到:

for line in range(i, i + 3): 
    print "%s .Line..\n" % line 
相關問題