本人目前剛學習python, 遇到了關于變量作用域的一些問題, 如下:
下面這個就不是非常明白
a = 3
def f():
a += 4
print(a)
f() # UnboundLocalError: local variable 'a' referenced before assignment
然后如果稍微改一下:
a = 3
def f():
b = a + 4
print(a)
f() # 3
這里新聲明了一個變量b, 對a進行了引用, 然后就可以訪問到a了, 不是明白為什么
另外如果將代碼 1 換成js, 結果又不同
var a = 3
const f = () => {
a += 4
console.log(a)
}
a() // 7
f() // 7
在js中不僅僅能夠訪問到全局變量, 甚至可以對全局變量進行修改, 所以在js里面作用域機制和python又有什么區(qū)別?
另外, 本人所了解到js與python都是靜態(tài)作用域, 原理應該相同, 但是上面顯示的結果卻很不一樣, 麻煩能有前輩清楚的解答一下, 本人才學疏淺, 見諒!
在 python 中
a += 4 其實就是a = a + 4
此時 相當于在函數(shù)內(nèi)部聲明了變量 a, 所以是調(diào)用不到外部的a的。
而在 js 中 a 并不是聲明的新變量,所以結果會不同。
js 中聲明變量是需要 var 之類的關鍵字的,python 不需要
如果想要python 中的 a 的指向全局需要明確指定
a = 3
def f():
global a // 明確指定是全局變量
a += 4
print(a)
f()
python 的代碼轉(zhuǎn)換為 js 代碼其實是這樣的:
var a = 3;
const f = () => {
var a;
a += 4;
console.log(a) // NaN 因為js的容錯機制,所以并沒有報錯。
}我來給你解釋一下吧,
對于舉例中的python和js中var定義的變量,他們作用域規(guī)則相似
不同點
var(我們先不討論let和const),否則就是直接調(diào)用全局的global 變量名
基于以上前提知識,請看注釋中的解釋
Python的代碼
a = 3 # 全局的a
def f():
a += 4 # a=a+4, 相當于先重新定義一個新變量a'(函數(shù)體f內(nèi)的a),
# 然后執(zhí)行a'+4時報錯:”沒有賦值就使用“
print(a) # 沒執(zhí)行到這步就,已經(jīng)在上面報錯了。
f() #調(diào)用時被報錯
a = 3 # 全局的a
def f():
global a # 加上這句后,下面再給賦值,就是針對全局變量了。
a += 4 # 全局的a被加4,變?yōu)?了
print(a) #
f() #7
a = 3
def f():
b = a + 4# 此處的a是全局的a
print(a) # 打印的是全局的a,沒上面那句b的賦值此處也是全局的a
f() # 3
Javascript的代碼
var a = 3
const f = () => {
a += 4 // 沒有用var,此處引用的是全局a
console.log(a)
}
a // 3 此處因為還沒執(zhí)行f函數(shù),a還沒有被改變
f() // 7 你的問題描述中寫的4,正確是7
a // 7 執(zhí)行過f(), 全局的a已經(jīng)被改變北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。