2013-07-15 76 views
2

此代碼給出了錯誤:UnboundLocalError: local variable 'LINES' referenced before assignmentLINES已清楚初始化,因爲如果我註釋掉print語句下面的行,它將不會引發錯誤並按預期打印len(lines) = 0。我不理解python的一些東西嗎?這裏發生了什麼?python全局變量for循環中未定義

LINES = [] 

def foo(): 
    for prob in range(1,3): 
    print "len(lines) = %d" % len(LINES) 
    LINES = [] 

if __name__ == "__main__": 
    foo() 

回答

4

可以訪問從內foo全局變量,但你不能重新綁定,除非他們的global關鍵字用於

因此,您可以使用LINES.append(...)LINES[:] = [],因爲它們只是修改LINES引用的列表。

當您嘗試使用分配LINES = []LINES來,Python知道它需要創建在函數的局部變量行中的條目。既然你正試圖將局部變量分配任何東西之前使用len(LINES),它會導致錯誤

您可以檢查foo這樣

>>> foo.func_code.co_nlocals 
2 
>>> foo.func_code.co_varnames 
('prob', 'LINES') 

如果再次定義foo沒有LINES = [],你會看到Python不再將其標記爲局部變量。

3

You need to use the global keyword:

def foo(): 
    global LINES 
    for prob in range(1,3): 
    print "len(lines) = %d" % len(LINES) 
    LINES = [] 

否則,Python會認爲LINES是本地的,並將其設置爲[]將是一個問題

你可以得到的全球價值之前打印出來的值變量LINES通過將其打印出來,但是當您擁有該語句時

LINES = [] 

它試圖設置LINES到一個新的列表,巨蟒將其解釋爲一個局部變量

+0

我明白了。但是爲什麼當'LINES = []'被註釋掉或被'LINES.append(prob)'替換時它工作? – anthonybell

0

在查找全局(模塊級)作用域之前,Python將首先查找變量的函數範圍。由於您在示例函數中分配了LINES,因此python知道不使用全局變量,但您在定義它之前嘗試訪問此變量。您應該在打印聲明之前初始化LINES,或者省略LINES = []聲明。

0

根據需要登錄稱,

Since you assign to LINES in your example function, python knows not to use the global variable, but you attempt to access this variable before you define it.

這不是結束,您可以通過使用一個全球性的關鍵字,告訴蟒蛇,在功能LINES是一樣的LINES外的函數的解決這個問題。

嘗試:

LINES = [] 

def foo(): 
    global lines 
    for prob in range(1,3): 
    print "len(lines) = %d" % len(LINES) 
    LINES = [] 

if __name__ == "__main__": 
    foo()