2 回答

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于Python2而言,對(duì)于一個(gè)全局變量,你的函數(shù)里如果只使用到了它的值,而沒(méi)有對(duì)其賦值(指a = XXX
這種寫(xiě)法)的話,就不需要聲明global。相反,如果你對(duì)其賦了值的話,那么你就需要聲明global
。聲明global
的話,就表示你是在向一個(gè)全局變量賦值,而不是在向一個(gè)局部變量賦值。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
Python的作用域解析是基于叫做LEGB(Local(本地),Enclosing(封閉),Global(全局),Built-in(內(nèi)置))的規(guī)則進(jìn)行操作的??聪旅娴睦?/p>
>>> x = 10>>> def foo():... x += 1... print x...>>> foo()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'x' referenced before assignment
這是因?yàn)?,在一個(gè)作用域里面給一個(gè)變量賦值的時(shí)候,Python自動(dòng)認(rèn)為這個(gè)變量是這個(gè)作用域的本地變量,并屏蔽作用域外的同名的變量。很多時(shí)候可能在一個(gè)函數(shù)里添加一個(gè)賦值的語(yǔ)句會(huì)讓你從前本來(lái)工作的代碼得到一個(gè)UnboundLocalError
。
下面的是文檔中的解釋?zhuān)?/p>
This is because when you make an assignment to a variable in a scope, that variable becomes local to that scope and shadows any similarly named variable in the outer scope.
在使用列表(lists)的時(shí)候,很容易就觸發(fā)這種錯(cuò)誤。看下面這個(gè)例子:
>>> lst = [1, 2, 3]>>> def foo1():... lst.append(5) # 這沒(méi)有問(wèn)題......>>> foo1()>>> lst[1, 2, 3, 5] >>> lst = [1, 2, 3]>>> def foo2():... lst += [5] # ... 這就有問(wèn)題了!...>>> foo2()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'lst' referenced before assignment
添加回答
舉報(bào)