2017-03-03 96 views
1

此代碼給出了一個「未結合的錯誤」Python的範圍錯誤

x=3 
def f(): 
    print x 
    x+=3 

這樣做的原因(在此查詢Python variable scope error討論)(如在答案給出)是一旦賦值運算符已被使用的「x」成爲一個局部變量,因爲「X」沒有連接到它的值,一個不能被3 增加它可是看看這個代碼

x=3 
def f(): 
    print x 
    x=3 

這一次,它似乎並不認爲「X」確實有一個值,因此不應該有任何問題,但相同的錯誤occ URS。

UnboundLocalError: local variable 'x' referenced before assignment 

如果python在閱讀'x = 3'語句後已經創建了一個局部變量'x',那麼它爲什麼不打印'x'?

這也是有趣在這裏,這段代碼不會產生錯誤

x=3 
def f(): 
    print x 
    x 

的出來是「3」(當f()被調用)

這混淆了我很多,」不是個注意這次也'x'在'f()'內部聲明,那麼不應該python添加這個'x'到它的局部變量列表?

+0

Python編譯您在函數中使用的變量名稱列表。這裏'x'將被使用,所以它已經爲它「保留」了空間,但它未被分配。 –

回答

0

x的範圍是f()之外

打印作品,未經分配,因爲它假設你是指外部範圍的X。如果您稍後嘗試分配它,它說:「哎,他一定是說這一個和那不是正確的」

x=3 
def f(): 
    print x 
    print locals() 


f() 
3 
{} 
2

好到你清楚鏈接的問題指出:

的Python把變量在功能上有所不同,具體取決於您是否從中爲您的賦值給它們。

所以在前兩個例子中分配給一個變量x - 你無論做了print聲明之前或之後 - 所以這意味着有一個局部變量x

在您的最後一個例子,你做不分配給xx不分配,只x =(或x +=等)分配。所以這是一個表達。因此在最後一個例子中沒有局部變量x,並且使用了功能範圍之外的變量。

+0

所以這意味着如果我不在函數定義中使用賦值運算符,那麼該變量將不會像第三種情況下那樣是局部變量? –

+1

@AirirhRoy:事實上,python會從具有相同名稱的變量的函數作用域中看出來。 –

0

其他人已經告訴我們爲什麼。除此之外,您可能希望看到這一點:

x = 3 

def f(): 
    global x 
    print(x) 
    x += 3 

比較來local變量,你可以使用global因爲某些原因。

+1

嗯,我當然知道,如果我想改變函數外的'x',我應該使用全局,但是我試圖知道Python究竟是如何解釋代碼並通過執行。像這裏的問題http://stackoverflow.com/questions/42023636/defining-variable-after-assigning-them-value-in-python-2-7 –