2 回答

TA貢獻1784條經(jīng)驗 獲得超2個贊
我來給你解釋一下吧,
對于舉例中的python和js中var定義的變量,他們作用域規(guī)則相似
變量作用域在定義它的函數(shù)內(nèi)(整個python或js文件可以看做一個大函數(shù))
根據(jù)第1點:函數(shù)內(nèi)出現(xiàn)與全局中定義的同名變量,在函數(shù)內(nèi),它會覆蓋全局的。
不同點
js函數(shù)內(nèi)定義變量要明確在變量名前寫上
var
(我們先不討論let和const),否則就是直接調(diào)用全局的python中定義變量直接寫變量名
pyhton函數(shù)中如果想給全局變量賦值,需要在賦值之前寫上
global 變量名
基于以上前提知識,請看注釋中的解釋
Python的代碼
a = 3 # 全局的adef 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 # 全局的adef f(): global a # 加上這句后,下面再給賦值,就是針對全局變量了。 a += 4 # 全局的a被加4,變?yōu)?了 print(a) # f() #7
a = 3def f(): b = a + 4# 此處的a是全局的a print(a) # 打印的是全局的a,沒上面那句b的賦值此處也是全局的af() # 3
Javascript的代碼
var a = 3const f = () => { a += 4 // 沒有用var,此處引用的是全局a console.log(a) }a // 3 此處因為還沒執(zhí)行f函數(shù),a還沒有被改變 f() // 7 你的問題描述中寫的4,正確是7a // 7 執(zhí)行過f(), 全局的a已經(jīng)被改變

TA貢獻1829條經(jīng)驗 獲得超13個贊
在 python
中
a += 4 其實就是a = a + 4
此時 相當于在函數(shù)內(nèi)部聲明了變量 a, 所以是調(diào)用不到外部的a的。
而在 js 中 a 并不是聲明的新變量,所以結(jié)果會不同。
js 中聲明變量是需要 var
之類的關鍵字的,python 不需要
如果想要python 中的 a 的指向全局需要明確指定
a = 3def 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的容錯機制,所以并沒有報錯。}
添加回答
舉報